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

Optional routing params passed to controller

在 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) 的情况。

如果 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).

达到同样的效果

希望对您有所帮助。