我在Laravel中有2个控制器,
Route::get('/books/{slug}', 'BooksController@slugShow');
Route::get('/books/{alphabet}', 'BooksController@showByAlphabet');
当仅使用一个控制器时,两个控制器都可以正常工作,但是当我将它们都放在Routs文件中时,只有第一个控制器可以工作。
子弹网址就像
https://www.example.com/books/once_upon_a_time
和“字母”网址是以字母开头的书籍列表
https://www.example.com/books/a
如果网址中的字符超过一个,我该如何使它们同时工作?
https://www.example.com/books/aa
or
https://www.example.com/books/once
答案 0 :(得分:4)
像这样使用
Route::get('/books/{alphabet}', 'BooksController@showByAlphabet')->where(['alphabet' => '[a-z]{1,1}']);
Route::get('/books/{slug}', 'BooksController@slugShow');
当{alphabet}
路由无效时,它将回退为。
答案 1 :(得分:3)
您应该更改Route并尝试。
Route::get('/books/alphabet/{alphabet}', 'BooksController@showByAlphabet');
因为您传递了相同的URl,并且不允许应用程序使用相同的路由名称。
答案 2 :(得分:1)
模式是相同的...就是问题所在。 您可以在路由中添加一个where条件,以将字母限制为1个字符
Route::get('/books/{alphabet}', 'BooksController@showByAlphabet')->where(['alphabet' => '[a-z]']);
答案 3 :(得分:0)
将路线用作...
Route::get('/books/{slug}', 'BooksController@slugShow');
Route::get('/books/{alphabet}', 'BooksController@showByAlphabet');
在laravel中,两条路由/books/{id}
被laravel读取,因此{slug}
和{alphabet}
被当作id。对于使用不同方法的URL可以被更改为/books/slug/{slug}
,对于字母/books/alphabets/{alphabet}
。
这样,您可以正确使用两个URL,方法将被调用。