gou*_*oup 4 php symfony-forms symfony twig
我有一个带有两种...Action()方法的控制器。当我在浏览器内使用/newTask路由名称调用路由时,我有一个表单来设置-object。通过 -Button 提交后,我想重定向到具有路由名称的路由:newTaskTaskSubmit/successtask_success
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}\nRun Code Online (Sandbox Code Playgroud)\n\n正如您所看到的,该方法successAction有一个参数$task,我需要用它来显示值success.html.twig,但我不需要\xc2\xb4ttask作为路线的一部分(例如\\success\\{task})。
那么如何使用参数进行重定向$task而不在路由内使用它呢?
如果你不想在 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)
使用serialize和unserialize函数的另一个解决方案:
$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)
| 归档时间: |
|
| 查看次数: |
8128 次 |
| 最近记录: |