【问题标题】:Optional routing params passed to controller传递给控制器​​的可选路由参数
【发布时间】:2020-01-30 23:16:21
【问题描述】:

在 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】:

    如果limitchannel 在您的路由中都是可选的url 段,那么如果limit 缺失,您的应用程序将不知道您打算填充channel 变量。它会误认为是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&amp;limit=30

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

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-06-02
      • 1970-01-01
      • 2016-05-16
      • 2017-01-12
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      相关资源
      最近更新 更多