我有一个控制器与两个...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');
然后,从你的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
的URL,并从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));
}