У меня есть простое приложение todo в Laravel. Я реализовал глобальные области видимости, чтобы пользователи не могли изменять элементы задач других пользователей. Моя глобальная область видимости выглядит следующим образом:
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' не существует. Кроме того, элемент todo '1blabla' не существует.
Я думал, что Global Scopes также справится с этим, но это явно не тот случай.
Какой лучший способ в Laravel определить поймать все маршруты, которые имеют дело с этим.