php - 如何使用模型注入绑定防止错误的 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 页面?
解决方案
在您的路由定义中,您可以对参数使用约束以避免匹配:
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']
]);
注意:这只是为了说明,我怀疑你需要它......
推荐阅读
- haskell - Haskell 中的递归定点函数
- javascript - 'class' 语法在 javascript 中是如何工作的?
- python - Pygame中的随机
- javascript - FullCalendar:如何在 eventDrop (node.js) 上保存/发送修改后的事件到数据库或服务
- sql - 删除一个 sys.service_queue
- javascript - 为什么这个闭包也需要在外部函数处返回?
- python - 在 Python 的四循环中使用 readline() 时如何忽略 .csv 文件中的空列?
- mysql - Obj.objects.filter() 挂起
- javascript - 使用 nodejs 从照片生成 gif
- c++ - 如何在 macOS 上的 Qt 中使用 OpenMP 进行编译?