2016-08-23 27 views
3

我有一個控制器有兩個...Action()-方法。當我在路由器名稱newTask內呼叫路由/newTask時,我有一個表單來設置Task -object。通過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

不起作用,因爲Controller「AppBundle \ Controller \ FormController :: successAction()」要求您爲「$ task」參數提供一個值(因爲沒有默認值或者因爲在此之後有非可選參數一)。 ' – goulashsoup

回答

3

如果你不想顯示的URL的任務數,可以將其ID傳遞到重定向會議收到的flashBag,並將其存儲時間:

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

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

然後,得到這個會話ID在你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'); 

    // ... 
} 

另一種解決方案,通過使用serializeunserialize功能:

$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