为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用模型注入绑定防止错误的 uuid?

如何使用模型注入绑定防止错误的 uuid?

PHP
UYOU 2022-01-08 14:54:55
使用 Laravel 6,我在控制器中注入了一个模型,如下所示:public function edit(School $school){    return view('/school/form', ['school' => $school]);}当我输入这样的网址时,一切正常:http://localhost:8000/schools/3d537a0f-4c74-4fae-99af-6f1b2c4b34c8/edit但是,如果我尝试另一个像这样的网址(使用错误的 uuid):http://localhost:8000/schools/3d537a0f-4c74-4fae-99af-6f/edit然后我有这个 PostgreSQL 错误:SQLSTATE [22P02]:无效的文本表示:7 错误:uuid 类型的输入语法无效:“3d537a0f-4c74-4fae-99af-6f1b2c4b34c”(SQL:从“学校”中选择 *,其中“id”= 3d537a0f-4c74-4fae- 99af-6f1b2c4b34c 限制 1)这是否意味着我必须先检查 uuid ?有什么优雅的方法可以防止这种情况并自动重定向到 404 页面?
查看完整描述

3 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

在您的路由定义中,您可以对参数使用约束以避免匹配:


Route::get('school/{school}/edit', 'SchoolController@edit')

    ->where('school', '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$');

这将导致 404,因为路由不匹配无效的 UUID。有关此主题的更多信息可以在文档中找到。还有一个解释如何定义一个全局约束以避免对每条路由重复它。


对于资源路由,解决方案略有不同。您将需要在boot()您的方法中定义一个全局约束RouteServiceProvider:


Route::pattern('school', '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$');

如果您的资源与路由参数的调用方式不同,则需要在定义路由资源时自定义参数名称:


Route::resource('university', 'UniversityController', [

    'parameters' => ['university' => 'school']

]);

注意:这只是为了说明,我怀疑你需要它......


查看完整回答
反对 回复 2022-01-08
?
慕神8447489

TA贡献1780条经验 获得超1个赞

是的,请检查 id 是否退出然后返回数据,否则重定向到 404。

或者您可以使用 Eloquent findOrFail 方法。示例:

$model = App\Flight::findOrFail(1);

如果找不到记录,这将自动重定向到 404。


查看完整回答
反对 回复 2022-01-08
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

我相信您在其他地方遇到了一个问题,它以某种方式干扰了模型分辨率,应该更深入地了解原因(也许像一个包?)。


作为一种解决方法,您可以使用显式绑定来防止此错误


在您的RouteServiceProvider.php文件中


use Ramsey\Uuid\Uuid;


...


public function boot()

{

    parent::boot();


    Route::bind('school', function ($value) {

        if (! Uuid::isValid($value)) { 

            throw (new ModelNotFoundException)->setModel(School::class, $value);

        }


        return School::findOrFail($value);

    });

}

但是,这只是为了修补不应该存在的错误。


查看完整回答
反对 回复 2022-01-08
  • 3 回答
  • 0 关注
  • 183 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信