如何使用不属于路由的参数重定向到路由()?
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');
// ...
}
另一个使用serialize
和unserialize
函数的解决方案:
$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));
}
我有一个带有两个 ...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');
// ...
}
另一个使用serialize
和unserialize
函数的解决方案:
$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));
}