Laravel Catch All route - PullRequest
       0

Laravel Catch All route

0 голосов
/ 08 апреля 2020

У меня есть простое приложение 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 определить поймать все маршруты, которые имеют дело с этим.

1 Ответ

0 голосов
/ 08 апреля 2020

Вы должны определить шаблон маршрутизации, который ограничивает параметр todo. Кстати, маршруты не будут совпадать, если шаблон не соответствует.

Например, если todo должно быть только цифрой c:

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');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...