Как перенаправить именованный маршрут с помощью строки запроса?

#laravel #url #redirect

#laravel #url #перенаправление

Вопрос:

У меня есть приведенный ниже код, который работает хорошо, как и ожидалось, но я хотел бы перенаправить на маршрут с помощью строки запроса, в соответствии с которой condition=$vehicle->conditionamp;make={{$vehicle->make}}amp;model={{$vehicle->model}}

    public function update()
  

      {
            //I've removed the logic for simplicity
            
            return redirect(route('vehicles.show', $vehicle))->with('flash', 
           'Vehicle Edited Successfully');
      }
 

Пробовал некоторые решения и некоторые ссылки, ссылающиеся на документацию, но все равно не смог заставить его работать. Любая помощь будет высоко оценена, приветствия!

Ответ №1:

Вторым параметром для route() помощника является список параметров. Любые переданные параметры, которые не определены в самом маршруте, будут добавлены к URL в качестве параметров строки запроса.

Ваш код будет выглядеть примерно так:

 return redirect(route('vehicles.show', [
    $vehicle,
    'condition' => $vehicle->condition,
    'make' => $vehicle->make,
    'model' => $vehicle->model
]))->with('flash', 'Vehicle Edited Successfully');
 

Комментарии:

1. Спасибо, ваш ответ и другой, приведенный здесь, решают мою проблему. Есть ли какое-либо преимущество перед другим или это просто вопрос предпочтений?

2. @AlphyGacheru Этот метод автоматически закодирует параметры запроса. Так, например, если бы в условии был амперсанд, этот метод кодировал бы его, тогда как обычная конкатенация строк — нет. Я думаю, что это немного чище. Кроме того, если вы когда-либо перемещали их в параметры маршрута, ваш код вообще не нужно было бы менять, но вероятность этого невелика.

Ответ №2:

Попробуйте объединить параметры запроса в методе перенаправления

 return redirect(
    route('vehicles.show', $vehicle) . 
    "?condition={$vehicle->condition}amp;make={$vehicle->make}amp;model={$vehicle->model}"
)
->with('flash', 'Vehicle Edited Successfully');
 

Более безопасным способом при объединении параметров строки запроса было бы использовать http_build_query() функцию, как указано в комментариях @patricus

 $queryString = http_build_query([
    'condition' => $vehicle->condition,
    'make' => $vehicle->make,
    'model' => $vehicle->model
]);

return redirect(route('vehicles.show') . "?{$queryString}")
    ->with('flash', 'Vehicle Edited Successfully');
 

Комментарии:

1. Спасибо, ваш ответ и другой, приведенный здесь, решают мою проблему. Есть ли какое-либо преимущество перед другим или это просто вопрос предпочтений?

2. Не могу придумать никакого преимущества / недостатка — однако ответ @patricus, вероятно, более похож на Laravel (ish) — честно говоря, я не знал, что значения, переданные в качестве 2-го параметра функции route, будут добавляться к строке запроса, если не к параметрам маршрута — мне все же нравится, чтобы было однозначно, что это строка запросапараметры so будут придерживаться моей версии — для меня это сводится к моим собственным предпочтениям

3. @Donkarnash Если вы предпочитаете придерживаться этого метода, вы можете включить http_build_query() функцию, чтобы ваши параметры при необходимости получали urlencoded . Представьте $vehicle->condition , что в параметре есть амперсанд. Без кодирования это приведет к разрыву строки запроса.