【问题标题】:Laravel Catch All routeLaravel Catch 所有路线
【发布时间】:2020-07-20 20:19:21
【问题描述】:

我在 Laravel 中有一个简单的 todo 应用程序。我已经实现了全局范围,以避免用户能够更改其他用户的待办事项。我的全局范围如下所示:

class UserScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->where('user_id', '=', Auth::id());
    }
}

在 Todo 模型中,我有以下内容:

类 Todo 扩展模型 { ...

protected static function booted()
{
    static::addGlobalScope(new UserScope);
}

}

路由文件是:

Auth::routes();

Route::group(['middleware' => ['auth', 'verified']], function() {
   Route::get('todos', 'TodosController@index')->name('todos.index');
   Route::post('todos', 'TodosController@store')->name('todos.store');
   Route::get('todos/create', 'TodosController@create')->name('todos.create');
   Route::patch('todos/{todo}', 'TodosController@update')->name('todos.update');
   Route::get('todos/{todo}', 'TodosController@show')->name('todos.show');
   Route::delete('todos/{todo}', 'TodosController@destroy')->name('todos.destroy');
   Route::get('todos/{todo}/edit', 'TodosController@edit')->name('todos.edit');
});

这很好用,用户无法访问其他人的项目。

但是,如果我有以下网址:

我收到一条简单的错误消息。

ErrorException 未定义变量:待办事项

原因是路线“blabla”不存在。此外,待办事项“1blabla”不存在。

我认为 Global Scopes 也会处理这个问题,但显然不是这样。

在 Laravel 中定义处理此问题的全部路由的最佳方法是什么。

【问题讨论】:

  • 错误来自哪里?它可能来自您的控制器,对吧?此外,您可以使用 resource controller: laravel.com/docs/7.x/controllers#resource-controllers 简化您的路线
  • 已修复。我的控制器的显示功能中有错字。我知道资源控制器优化。

标签: laravel


【解决方案1】:

您应该定义一个限制todo 参数的路由模式。顺便说一句,如果模式不匹配,路由将不匹配。

例如,如果todo 只能是数字:

Route::pattern('todo', '\d+');

https://laravel.com/docs/7.x/routing#parameters-global-constraints

如果你想要运行时检查,你需要一个中间件来检查请求的路由

$todo = $request->route()->param('todo');
if ($notValidTodo) {
    abort(404, 'Not found todo');
}

【讨论】:

  • 谢谢,使用路由模型绑定时是否也需要这样做?它现在可以工作了,因为我在 show 函数中发现了一个小错误。我通过了$id 而不是Todo $todo。但它引发了是否需要路由模式的问题。
  • 这取决于您要处理“未找到”情况的方式,要么在路由上获得不匹配并回退到 404 路由,要么接受它,无论值如何,然后再检查。
猜你喜欢
  • 2013-04-17
  • 2017-04-30
  • 2012-09-22
  • 2016-05-09
  • 2017-03-07
  • 2012-10-29
  • 2019-06-24
  • 1970-01-01
相关资源
最近更新 更多