首页 > 解决方案 > 如何使用模型注入绑定防止错误的 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 页面?

标签: phplaravelpostgresql

解决方案


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

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']
]);

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


推荐阅读