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

How to redirectToRoute() with arguments which are not part of the route?

我有一个带有两个 ...Action() 方法的控制器。当我在浏览器中使用路由名称 newTask 调用路由 /newTask 时,我有一个用于设置 Task 对象的表单。通过 Submit-Button 提交后,我想重定向到路由名称 task_success:

的路由 /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 的情况下使用参数重定向?

如果你不想在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 like /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));
}