Laravel:检查控制器中的id是否为某个实例

时间:2016-07-04 17:29:32

标签: laravel laravel-5

我有一个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实例。

这样做的最佳方式是什么?

2 个答案:

答案 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]);
}