2016-08-23 4 views
3

У меня есть контроллер с двумя ...Action()-методами. Когда я вызываю маршрут /newTask с именем маршрута newTask внутри браузера У меня есть форму, чтобы установить Task -объект. После подачи с помощью Submit -Кнопки Я хочу, чтобы перенаправить на маршрут /success с названием маршрута task_success:Как redirectToRoute() с аргументами, которые не являются частью маршрута?

class FormController extends Controller { 

    /** 
    * @Route("/newTask", name="newTask") 
    */ 
    public function newAction(Request $request) 
    { 
     // create a task and give it some dummy data for this example 
     $task = new Task(); 
     $task->setTask('Write a blog post'); 

     $task->setDueDate(new \DateTime('tomorrow')); 
     $form = $this->createFormBuilder($task) 
      ->add('task', TextType::class) 
      ->add('dueDate', DateType::class) 
      ->add('save', SubmitType::class, array('label' => 'Create Task')) 
      ->getForm(); 

     $form->handleRequest($request); 
     if ($form->isSubmitted() && $form->isValid()) { 
      //Here I want to redirect... 
      return $this->redirectToRoute('task_success', array('task' => $task)); 
    } 

     return $this->render('default/new.html.twig', array(
      'form' => $form->createView(), 
     )); 
    } 

    /** 
    * @Route("/success", name="task_success") 
    */ 
    public function successAction($task){ 
     return $this->render('default/success.html.twig',array('task' => $task)); 
    } 

} 

Как вы можете видеть, метод successAction имеет параметр $task, который мне нужно показать значения с success.html.twig, но мне не нужно task в качестве части маршрута (например, \success\{task}).

Так как я могу перенаправить с аргументом $task, не используя его внутри маршрута?

+0

'return $ this-> redirect ($ this-> generateUrl ('task_success', array ( 'task' => $ task, ) ));'? – DOZ

+0

Не работает, потому что «Контроллер» AppBundle \ Controller \ FormController :: successAction() требует, чтобы вы предоставили значение для аргумента «$ task» (поскольку значение по умолчанию отсутствует или потому что после него есть необязательный аргумент один). ' – goulashsoup

ответ

3

Если вы не хотите отображать номер задачи в URL, вы можете передать свой идентификатор сеанса flashBag перед перенаправлением и хранить его во времени:

$this->addFlash('success_task_id', $task->getId()); 

return $this->redirectToRoute('task_success'); 

Затем получить этот идентификатор из сессии в вас successAction метод:

/** 
* @Route("/success", name="task_success") 
*/ 
public function successAction(){ 
    $taskId = $this->get('session')->getFlashBag()->get('success_task_id'); 
    $task = $this->getDoctrine()->getRepository('AppBundle:Task')->find($taskId); 

    return $this->render('default/success.html.twig', array('task' => $task)); 
} 

Однако, если видимость числа задач, не важно, просто использовать его в newAction:

return $this->redirectToRoute('task_success', array('task' => $task->getId())); 

В этом генерирует один URL, как /success?task=1 и получить номер из запроса запрос мешка параметра в successAction:

public function successAction(Request $request){ 
    $taskId = $request->query->get('task'); 

    // ... 
} 

Другим решением с помощью serialize и unserialize функции:

$this->addFlash('success_task', serialize($task)); 

return $this->redirectToRoute('task_success'); 

Затем получить сериализованные данные от сессии в вас successAction метод:

/** 
* @Route("/success", name="task_success") 
*/ 
public function successAction(){ 
    $task = unserialize($this->get('session')->getFlashBag()->get('success_task')); 

    return $this->render('default/success.html.twig', array('task' => $task)); 
} 
+0

Хорошо спасибо, но нет ли способа без использования' ids' и 'doctrine'? – goulashsoup

+0

Да, вы можете сериализовать объект задачи с помощью 'serialize()' и 'unserialized()' функций, работающих с сеансом flashBag – yceruto

+0

Я только что обновил свой ответ с сериализацией версии – yceruto

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