传递到控制器的可选路由参数

问题描述 投票:0回答:1

在Laravel 6.x中,如何获取控制器的可选参数?例如,我的路线:

Route::get('/videos/{limit?}/{channel?}, VideosController@index);

而且在我的VideosController中,我有一个方法:

public function index($limit=20, $channel=null)
{
   if (!is_null($channel))
   { 
      $channel_id = channel::where('name', $channel);
      $result = 
          <some complicated DB query>
          ->where('channel_id', $channel_id)
          ->limit($limit)
          ->first();
   } else {
      $result = 
          <some complicated DB query>
          ->limit($limit)
   }
}

但是由于某些原因,我似乎从未陷入!is_null($channel)案。

routes laravel-routing laravel-6 php-7.3
1个回答
0
投票

如果limitchannel都是路径中的可选URL段,则如果channel丢失,则应用程序将不知道您打算填充limit变量。它将误认为它是limit

在您的情况下,最好将它们作为GET参数传递,并在控制器中检查是否已填充它们。

首先,更改路线以排除可选参数:

Route::get('/videos', VideosController@index);

然后在您的控制器中:

public function index()
{
   if (request()->has('channel'))
   { 
      $channel_id = channel::where('name', request('channel'));
      $result = 
          <some complicated DB query>
          ->where('channel_id', $channel_id)
          ->limit(request('limit', 20))
          ->first();
   } else {
      $result = 
          <some complicated DB query>
          ->limit(request('limit', 20))
   }
}

然后,查询将是/videos?channel=example&limit=30

request()帮助器允许在已传递参数的情况下设置默认值。通常,您会看到在控制器内传递的请求,因此可以使用$request->query('limit', 20)实现相同的功能。

我希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.