我有一个Laravel应用程序,其路径如下:
Route::get('event/{id}/stages', [
'as' => 'events_list',
'uses' => 'EventsController@show'
]);
在控制器中我定义方法如下:
public function show($id) {
$event = Event::find($id);
return view('showEvent', ['event' => $event]);
}
问题是我可以传递{id}中的任何值,因此它应该适用于
但它不适用于
第一个不应该工作,因为20不是有效的id(只有4个事件)而且foo不应该工作,因为它是一个字符串。两者都应该被检查并重定向到404页面。
理想情况下,我可以检查{id}是否是在数据库中有条目的Event实例。
这样做的最佳方式是什么?
答案 0 :(得分:1)
您可以使用路由实例上的where方法约束路由参数的格式。
Route::get('event/{id}/stages', [
'as' => 'events_list',
'uses' => 'EventsController@show'
])->where('id', '[0-9]+');
要检查事件是否存在,您可以使用路径模型绑定:
Route::get('event/{event}/stages', [
'as' => 'events_list',
'uses' => 'EventsController@show'
]);
然后:
public function show(Event $event) {
return view('showEvent', ['event' => $event]);
}
如果在数据库中找不到匹配的模型实例,将自动生成404 HTTP响应。
答案 1 :(得分:0)
您可以使用findOrFail()
代替find()
。
public function show($id) {
$event = Event::findOrFail($id);
if ($event->isEmpty()) {
abort(404);
}
return view('showEvent', ['event' => $event]);
}