0

我在 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');
});

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

但是,如果我有以下 URL:

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

ErrorException 未定义的变量:todo

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

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

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

4

1 回答 1

0

您应该定义一个限制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');
}
于 2020-04-08T12:20:13.310 回答