使用laravel 6,我在控制器中注入一个模型,如下所示:

public function edit(School $school)
{
    return view('/school/form', ['school' => $school]);
}

当我输入如下url时,一切正常:
http://localhost:8000/schools/3d537a0f-4c74-4fae-99af-6f1b2c4b34c8/edit

但如果我尝试另一个类似的url(使用错误的uuid):
http://localhost:8000/schools/3d537a0f-4c74-4fae-99af-6f/edit

那么我有一个postgresql错误:
SQLSTATE[22P02]:无效的文本表示:7错误:无效
uuid类型的输入语法:“3d537a0f-4c74-4fae-99af-6f1b2c4b34c”
(SQL:select*from“schools”where“id”=
3d537a0f-4c74-4fae-99af-6f1b2c4b34c极限1)
这是否意味着我必须先检查uuid?有没有什么优雅的方法可以防止这种情况并自动重定向到404页面?
谢谢
多姆

最佳答案

在管线定义中,可以对参数使用约束以避免匹配:

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不匹配。有关此主题的更多信息,请参见in the documentation。还有一个解释是如何定义全局约束以避免对每个路由重复它。
对于资源路由,解决方案略有不同。您需要在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']
]);

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

关于php - Laravel如何通过模型注入(inject)绑定(bind)来防止错误的uuid?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57901103/

10-16 20:35