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

gou*_*oup 4 php symfony-forms symfony twig

我有一个带有两种...Action()方法的控制器。当我在浏览器内使用/newTask路由名称调用路由时,我有一个表单来设置-object。通过 -Button 提交后,我想重定向到具有路由名称的路由:newTaskTaskSubmit/successtask_success

\n\n
class FormController extends Controller {\n\n    /**\n     * @Route("/newTask", name="newTask")\n     */\n    public function newAction(Request $request)\n    {\n        // create a task and give it some dummy data for this example\n        $task = new Task();\n        $task->setTask(\'Write a blog post\');\n\n        $task->setDueDate(new \\DateTime(\'tomorrow\'));\n        $form = $this->createFormBuilder($task)\n            ->add(\'task\', TextType::class)\n            ->add(\'dueDate\', DateType::class)\n            ->add(\'save\', SubmitType::class, array(\'label\' => \'Create Task\'))\n            ->getForm();\n\n        $form->handleRequest($request);\n        if ($form->isSubmitted() && $form->isValid()) {\n            //Here I want to redirect...\n            return $this->redirectToRoute(\'task_success\', array(\'task\' => $task));\n    }\n\n        return $this->render(\'default/new.html.twig\', array(\n            \'form\' => $form->createView(),\n        ));\n    }\n\n    /**\n     * @Route("/success", name="task_success")\n     */\n    public function successAction($task){\n        return $this->render(\'default/success.html.twig\',array(\'task\' => $task));\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

正如您所看到的,该方法successAction有一个参数$task,我需要用它来显示值success.html.twig,但我不需要\xc2\xb4ttask作为路线的一部分(例如\\success\\{task})。

\n\n

那么如何使用参数进行重定向$task而不在路由内使用它呢?

\n

yce*_*uto 5

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

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

return $this->redirectToRoute('task_success');
Run Code Online (Sandbox Code Playgroud)

然后,在您的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));
}
Run Code Online (Sandbox Code Playgroud)

但是,如果任务编号的可见性并不重要,只需将其用于newAction

return $this->redirectToRoute('task_success', array('task' => $task->getId()));
Run Code Online (Sandbox Code Playgroud)

这会生成一个 URL,如下所示/success?task=1,并从请求查询参数包中获取编号successAction

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)

使用serializeunserialize函数的另一个解决方案:

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

return $this->redirectToRoute('task_success');
Run Code Online (Sandbox Code Playgroud)

然后,在您的方法中从会话中获取序列化数据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));
}
Run Code Online (Sandbox Code Playgroud)