2015-08-11 3 views
3

Как направить с параметрами GET?Как перенаправить параметры GET?

У меня есть два действия в одном контроллере. Я делаю магию в первом действии, и если все идет хорошо, я хочу, чтобы он перешел на другой, но с параметрами GET, созданными в первом.

То, что я сейчас это:

return $this->forward('AppBundle:default:tracked', array(), array(
        'tracking_code' => $tracking_code, 
        'company'  => $tp_company_name 
      ))); 

Пустой массив там из-за отчаянной попытке заставить его работать. сообщает, что второй массив предназначен для параметров запроса, но ничего действительно не происходит, поэтому я должен делать что-то неправильно.

Второе действие пытается получить параметры, как это:

/** 
* @Route("/tracked", name="tracked") 
*/ 
public function trackedAction() 
{ 
    $request = Request::createFromGlobals(); 
    // If there is the required variables in the GET: 
    if($request->query->has('tracking_code') && $request->query->has('company')) 

Но нет, переменные никогда не там, кажется.

Причина У меня такая настройка, это то, что пользователь может попасть в trackedAction из другого места.

ответ

3

Я думаю, что правильный способ получить параметры в вашем втором действии будет сделать так:

return $this->forward('AppBundle:default:tracked', array(
       'tracking_code' => $tracking_code, 
       'company'  => $tp_company_name 
     ))); 

И ваше второе действие будет:

/** 
* @Route("/tracked/{tracking_code}/{company}", name="tracked") 
*/ 
public function trackedAction($tracking_code=null, $company=null) 
{ 
    ... 
} 

Я использовал $tracking_code = null, потому что вы указали, что к нему можно получить доступ из другого места, что, возможно, не дает этих параметров. Таким образом, он работает для них обоих.

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

+0

Приветствия! Раньше я пытался использовать этот вид решения, и он всегда жаловался на несуществующие переменные или что-то подобное, поэтому я тоже отказался от этого в этой ситуации. Конечно, предоставление переменных null по умолчанию имеет смысл! – GotBatteries

+0

Рад, что это помогло :) –

2

Способ, которым работает переадресация контроллера Symfony, путем дублирования тока Request с параметрами, которые вы передаете, а затем переотправки через компонент HttpKernel. Вы можете увидеть это in the code. Поскольку это суб-запрос, ваше второе действие создает Request из глобальных переменных (т. Е. $_GET и т. Д.), Которые не изменились.

Решение изменить второе действие метода подписи:

public function trackedAction(Request $request) 

Это означает, что переменная $request будет «локальный» для ваших действий и будет содержать переменные, которые вы хотите.

На практике вы должны всегда пройти Request в ваши действия таким образом, как это делает контроллеры намного больше проверяемыми и предотвращает странные проблемы, как это.

В качестве альтернативы ко всему вышесказанному вы можете использовать вместо этого redirect, который будет перенаправлять HTTP, а не просто пересылать в системе запроса Symfony.

Смежные вопросы