Необязательные параметры маршрутизации передаются в контроллер - PullRequest
0 голосов
/ 01 октября 2019

В Laravel 6.x как я могу получить необязательные параметры для моего контроллера? Например, мой маршрут:

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

И в моем VideoController у меня есть метод:

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

1 Ответ

2 голосов
/ 02 октября 2019

Если limit и channel являются необязательными сегментами 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).

Надеюсь, это поможет.

...