【问题标题】:Same url for different routes laravel不同路线的相同网址 laravel
【发布时间】:2020-12-03 01:11:21
【问题描述】:

我有这两条路线

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

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

【问题讨论】:

  • 我建议您将此路由链接到一个检查内容类型的函数,如果 {book} 不在书表中,则显示类别
  • 你不能这样做,两者相互冲突

标签: php laravel url routes


【解决方案1】:

路由器应该如何知道/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 在他的回答中所说的那样)。

【讨论】:

    【解决方案2】:

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

    但是当有差异时你可以使用regular-expression-constraints

    【讨论】:

      【解决方案3】:

      你不能让它们都运行,因为 Laravel 无法区分这些路由,因为它们基本上具有相同的 URL。如果您的两个控制器在同一页面上显示结果(例如:书籍索引),解决方法可能是创建一个带有可选参数的路由:

      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 
      }
      

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

      您可以在此处阅读有关 Laravel 的更多信息optional parameters

      【讨论】:

        猜你喜欢
        • 2015-08-29
        • 2014-04-15
        • 2015-10-16
        • 1970-01-01
        • 1970-01-01
        • 2017-08-29
        • 1970-01-01
        • 1970-01-01
        • 2016-12-23
        相关资源
        最近更新 更多