我有一个带有两个/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}}的情况下重定向?
答案 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');
// ...
}
使用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));
}