如何使用不属于路由的参数重定向ToRoute()?

时间:2016-08-23 15:06:22

标签: php twig symfony symfony-forms

我有一个带有两个/newTask方法的控制器。当我在浏览器中调用路由名为newTask的路由Task时,我有一个表单来设置Submit - 对象。通过/success提交后 - 按钮我想重定向到路由名为task_success的路由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路线的一部分(例如{{1}})。

那么如何在不在路由中使用参数{{1}}的情况下重定向?

1 个答案:

答案 0 :(得分:3)

如果您不想在URL中显示任务编号,可以在重定向之前将其ID传递给会话flashBag并暂时存储:

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

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

然后,从您successAction方法的会话中获取此ID:

/**
 * @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()));

这会生成一个类似/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));
}