不同路线的Laravel的网址相同

问题描述

我有两条路线

Route::get('/books/{book}','FrontEnd\BooksController@show');
Route::get('/books/{main_category}','SearchController@getProducts')->name('getProducts');

有什么办法可以让两者同时运行..

解决方法

当url具有相同的参数类型/长度或任何其他结构时,将无法区分它们。

但是如果有差异,您可以使用regular-expression-constraints

,

路由器应该如何知道您使用/books/Harry Potter - And The Goblet of Fire/books/Fantasy所指的路由?无法将这些路线彼此区分开。

您最好的选择是使用查询参数过滤图书-例如

/books/?name=Harry Potter - And The Goblet Of Fire
/books/?category=Fantasy

但是/ books / {whatever}应该为一本书的主键保留。因此,您可以执行类似/books/1/author/books/32784893/ratings的操作。

仅当您可以确定地区分值时,相同的路线才有效(如Pilan在其回答中所述)。

,

您不能使它们都运行,因为Laravel无法区分这些路由,因为它们基本上具有相同的URL。如果两个控制器都在同一页面上显示结果(例如,books索引),则解决方法是采用一条可选参数制作一条路线:

Route::get('/books/{book}/{main_category?}','FrontEnd\BooksController@show');

然后,您可以将两种路由引导到同一方法,并根据获取的参数在那里进行查询:

public function show(Request $request){
   $books = Book::query(); //initiate query on Book model
   if($request->book){
     $books = $books->where('...'); //Override the query with new results using book parameter
   } 
   
   if($request->main_category){
     $books = $books->where('...'); //Override the query with new results using book main_category
   }

   $books = $books->get(); //Retrieve all the results 
}

注意:这未经测试,只是一个简单的想法,您可以如何改进代码并使用一种控制器以一种方法显示书籍结果,而不是使用两种不同的控制器。希望我能给你一些想法。

在这里您可以了解有关Laravels optional parameters的更多信息。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...