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

使用 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 页面?


UYOU
浏览 187回答 3
3回答

慕后森

在您的路由定义中,您可以对参数使用约束以避免匹配: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']]);注意:这只是为了说明,我怀疑你需要它......

慕神8447489

是的,请检查 id 是否退出然后返回数据,否则重定向到 404。或者您可以使用 Eloquent findOrFail 方法。示例:$model = App\Flight::findOrFail(1);如果找不到记录,这将自动重定向到 404。

梵蒂冈之花

我相信您在其他地方遇到了一个问题,它以某种方式干扰了模型分辨率,应该更深入地了解原因(也许像一个包?)。作为一种解决方法,您可以使用显式绑定来防止此错误在您的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);    });}但是,这只是为了修补不应该存在的错误。
打开App,查看更多内容
随时随地看视频慕课网APP