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

为什么只有第一个控制器在Laravel工作,laravel,laravel-5,eloquent,Laravel,Laravel 5,Eloquent,我在拉雷维尔有两个控制器 Route::get('/books/{slug}', 'BooksController@slugShow'); Route::get('/books/{alphabet}', 'BooksController@showByAlphabet'); 当只使用一个控制器时,两个控制器都可以正常工作,但当我将它们都放在Routs文件中时,只有第一个控制器可以工作 slug URL类似于 https://www.example.com/books/once_upon_a_ti

我在拉雷维尔有两个控制器

Route::get('/books/{slug}', 'BooksController@slugShow');
Route::get('/books/{alphabet}', 'BooksController@showByAlphabet');
当只使用一个控制器时,两个控制器都可以正常工作,但当我将它们都放在Routs文件中时,只有第一个控制器可以工作

slug URL类似于

https://www.example.com/books/once_upon_a_time
字母URL是以字母开头的书籍列表

https://www.example.com/books/a
我怎样才能使它们都工作,我还希望url的字母不工作,如果有超过一个单一的字符在url中,如

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

模式是相同的。。。这就是问题所在。 您可以在路由中添加where条件,将字母表限制为1个字符


路由::获取'/books/{alphabet}','BooksController@showByAlphabet'->其中['alphabet'=>'[a-z]']

模式是相同的。。。这就是问题所在。 您可以在路由中添加where条件,将字母表限制为1个字符


路由::获取'/books/{alphabet}','BooksController@showByAlphabet'->其中['alphabet'=>'[a-z]']

您应该改变路线并尝试一下

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

因为您传递了相同的URl,应用程序不允许使用相同的路由名称。

您应该更改路由并尝试

Route::get('/books/alphabet/{alphabet}', 'BooksController@showByAlphabet');
因为您传递了相同的URl,应用程序不允许使用相同的路由名称。

这样使用

Route::get('/books/{alphabet}', 'BooksController@showByAlphabet')->where(['alphabet' => '[a-z]{1,1}']);
Route::get('/books/{slug}', 'BooksController@slugShow');
当{alphabet}路由无效时,它将回退到slug。

像这样使用

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

当{alphabet}路由无效时,它将回退到slug。

当您将路由用作

Route::get('/books/{slug}', 'BooksController@slugShow');
Route::get('/books/{alphabet}', 'BooksController@showByAlphabet');
在这两种路由中,laravel读取/books/{id},因此{slug}和{alphabet}被视为id。对于使用不同的方法,url可以更改为/books/slug/{slug}和alphabets/books/alphabets/{alphabet}


通过这种方式,您可以正确使用URL,并将调用方法。

当您将路由用作

Route::get('/books/{slug}', 'BooksController@slugShow');
Route::get('/books/{alphabet}', 'BooksController@showByAlphabet');
在这两种路由中,laravel读取/books/{id},因此{slug}和{alphabet}被视为id。对于使用不同的方法,url可以更改为/books/slug/{slug}和alphabets/books/alphabets/{alphabet}


通过这种方式,您可以正确使用URL并调用方法。

同时发布控制器代码,以便我们能够找出错误并发布您遇到的错误。您可以尝试为每个请求创建不同的路由,如/books/slug/{slug}和/books/alphabet/{alphabet}对于不同的功能,不要使用相同的路由。slug就是slug,不管是单词还是句子,我不能把它改成/books/alphabet/{alphabet},但我可以把slug改成/books/{id}/{slug},但这给我带来了一个问题。我如何创建一个检查,以确保id和slug必须保持不变,并且不能操作slug。同时发布控制器代码,以便我们能够找出错误并发布您得到的错误。您可以尝试为每个请求创建不同的路由,如/books/slug/{slug}和/books/alphabet/{alphabet}对于不同的功能,不要使用相同的路由。slug就是slug,不管是单词还是句子,我不能把它改成/books/alphabet/{alphabet},但我可以把slug改成/books/{id}/{slug},但这给我带来了一个问题。我如何才能创建一个检查,以确保id和slug必须保持不变,并且不能操纵slug。@尼廷·甘地如果我的答案解决了您的问题,请接受我的答案。此解决方案强制改变路由结构。Shaielndra的解决方案保持相同的结构并满足要求。@Nitin Gandhi如果我的答案解决了您的问题,请接受我的答案。此解决方案强制改变路线结构。Shaielndra的解决方案保持了相同的结构并满足了需求。这是正确的解决方案,缺少一个细节。将{alphabet}路由放在{slug}路由之前,这样它才能工作。乐意帮助并接受,这样其他人也能得到帮助这是正确的解决方案,缺少一个细节。将{alphabet}路径放在{slug}路径之前,这样它才能工作。乐意帮助并接受帮助,以便其他人能够获得帮助