【问题标题】:Multiple optional parameter ordering issues多个可选参数排序问题
【发布时间】:2019-11-08 10:47:58
【问题描述】:

我想要这样的结果:

Route::get('blogs', 'Blogs@index')->name('blogs');
Route::get('blogs/{section?}/{category?}', 'Blogs@index');

示例:

Blogs/
Blogs/section
Blogs/category

控制器:

public function index($section= '', $category= '', Request $request)
{

}

当我通过第二个 para 控制器时,将其作为第一个(部分)

【问题讨论】:

标签: php laravel routing routes


【解决方案1】:

您可以这样做的唯一方法是检查输入是否与某个部分或类别匹配,然后调用正确的控制器。

例如:

Route::get('blogs/{slug}', function ($slug) {
   // Check if this is a section
   if (SectionModel::where('slug', $slug)->first()) {
        return \App::call('\App\Http\Controllers\Sections@index');
   }

   // Check if this is a category
   if (CategoryModel::where('slug', $slug)->first()) {
        return \App::call('\App\Http\Controllers\Categories@index');
   }

   // Section or category doesn't exist
   abort(404);
});

【讨论】:

  • 如果部分和类别具有相同的名称,例如部分 = 大学类别 = 大学
  • @divakar 这取决于你,其中一个必须有优先权。
【解决方案2】:

顺序很重要。改用这个:

Route::get('blogs/{section?}/{category?}', 'Blogs@index');
Route::get('blogs', 'Blogs@index')->name('blogs');

更新:

为什么不将您正在寻找的东西作为 GET 参数传递?这样做,你只需要检查index()函数内部是否有它们,并根据它们采取行动:

Route::get('blogs', 'Blogs@index')->name('blogs');

示例:

Blogs?section=any-section&category=any-category

控制器:

public function index(Request $request): Response
{
    if ($request->section) {/**/}
    if ($request->category) {/**/}
    // ...
}

【讨论】:

  • blogs/passed_value 如何知道传递的值是控制器中的部分或类别。如果我通过 category 和 section = null 所以控制器将 category 作为部分参数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多