Почему в Laravel работает только первый контроллер

У меня есть 2 контроллера в Laravel as

Route::get('/books/{slug}', 'BooksController@slugShow');
Route::get('/books/{alphabet}', 'BooksController@showByAlphabet');

Оба контроллера работают нормально при использовании только одного, но когда я помещаю их в файл маршрутов, работает только первый.

slug urls похожи

https://www.example.com/books/once_upon_a_time

и Alphabets urls - список книг, начинающихся с алфавита

https://www.example.com/books/a

Как я могу заставить их работать, и я также хочу, чтобы URL-адреса алфавитов не работали, если в URL-адресе больше одного символа

https://www.example.com/books/aa
or
https://www.example.com/books/once

Всего 4 ответа


Используйте это

Route::get('/books/{alphabet}', 'BooksController@showByAlphabet')->where(['alphabet' => '[a-z]{1,1}']);
Route::get('/books/{slug}', 'BooksController@slugShow');

Когда маршрут {alphabet} недействителен, он будет возвращаться к slug.


Вы должны изменить маршрут и попробовать его.

Route::get('/books/alphabet/{alphabet}', 'BooksController@showByAlphabet');

Поскольку вы прошли один и тот же URl, и приложение не разрешает одно и то же имя маршрута.


шаблоны идентичны ... вот в чем проблема. Вы можете добавить условие для вашего маршрута, чтобы ограничить 1 символ для алфавита

Route::get('/books/{alphabet}', 'BooksController@showByAlphabet')->where(['alphabet' => '[az]']);


Когда вы используете маршруты как

Route::get('/books/{slug}', 'BooksController@slugShow');
Route::get('/books/{alphabet}', 'BooksController@showByAlphabet');

В обоих маршрутах /books/{id} читается laravel, поэтому {slug} и {alphabet} берутся как id. Для использования другого метода url может быть изменен как /books/slug/{slug} и для алфавитов /books/alphabets/{alphabet} .

Таким образом, вы можете использовать оба URL правильно, и будет вызван метод.


Есть идеи?

10000