为什么只有第一个控制器在Laravel中工作

时间:2018-10-31 09:48:05

标签: laravel laravel-5 eloquent

我在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

4 个答案:

答案 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,方法将被调用。