如何使用redirectToRoute正确传递对象?
Posted
技术标签:
【中文标题】如何使用redirectToRoute正确传递对象?【英文标题】:How to pass correctly object using redirectToRoute? 【发布时间】:2018-02-14 18:08:50 【问题描述】:这是我的简单代码
类 LuckyController 扩展控制器 公共函数 taskFormAction(请求 $request) $task = 新任务(); //$task->setTask('测试任务'); //$task->setDueDate(new \DateTime('明天中午')); $form = $this->createFormBuilder($task) ->add('task', TextType::class) ->add('dueDate', DateType::class) ->add('save', SubmitType::class, array('label' => 'Save')) ->getForm(); $form->handleRequest($request); if($form->isSubmitted() && $form->isValid()) $task = $form->getData(); return $this->redirectToRoute('task_ok', array('task' => '123')); return $this->render('pre.html.twig', array('pre' => print_r($task, true), 'form' => $form->createView())); 公共函数taskOKAction(任务$task) return $this->render('ok.html.twig', array('msg' => 'ok', 'task' => print_r($task, true)));还有这一行
return $this->redirectToRoute('task_ok', array('task' => '123'));
重定向到 taskOKAction,但它允许我通过 URL (?task=123) 发送参数。
我需要将对象 $task 发送到 taskOKAction 以在屏幕上打印用户在表单中输入的内容。
我该怎么做?在询问好的解决方案是存储表单中的数据(例如在数据库或文件中)并在 URL 中传递对象 ID 的参数之前,我已经在 *** 上发红了。我认为这是一个很好的解决方案,但它增加了我检查用户是否没有更改 URL 中的 ID 以显示其他对象的责任。
最好的方法是什么?
最好的问候, L.
【问题讨论】:
【参考方案1】:从您的表单操作中,您可以在没有实际 302 重定向的情况下执行此操作:
public function taskFormAction(Request $request)
$task = new Task();
//$task->setTask('Test task');
//$task->setDueDate(new \DateTime('tomorrow noon'));
$form = $this->createFormBuilder($task)
->add('task', TextType::class)
->add('dueDate', DateType::class)
->add('save', SubmitType::class, array('label' => 'Save'))
->getForm();
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid())
$task = $form->getData();
return $this-taskOKAction($task)
这是完全合法的,你的前端同事会感谢你没有重定向。
【讨论】:
您如何进行验证并像这样注册到数据库? @t-n-y 为了清楚起见,我将问题中的一些上下文代码复制到我的答案中。 错了,他不想在表单提交之前渲染'ok'模板,他想要'pre'模板 谢谢,但此解决方案允许用户通过从表单重新发送整个日期来刷新表单。我想避免这种情况,并使用单独的 url 来显示“成功”消息。 @t-n-y 你知道这个解决方案有什么改进吗?【参考方案2】:使用parameter converter 并正确注释路线。
类似的东西(如果您对路线使用注释)
/**
* @Route("/task/ok/id")
* @ParamConverter("task", class="VendorBundle:Task")
*/
public function taskOKAction(Task $task)
如果参数只有一个并且如果是类型提示(如您的情况),您也可以省略 @ParamConverter
部分
【讨论】:
我使用 routing.yml。我试图做你的解决方案,所以我写道:path: /task/ok/task
在接下来的路由中,我将代码更改为return $this->redirectToRoute('task_ok', array('task' => $task));
来传输对象,我得到了Warning: preg_match() expects parameter 2 to be string, object given
:( 我在 taskOK 操作之前还添加了@ParamConverter("task", class="AppBundle:Entity:Task")
。
不传对象,只传id以上是关于如何使用redirectToRoute正确传递对象?的主要内容,如果未能解决你的问题,请参考以下文章
Angular - 如何正确使用服务、HttpClient 和 Observables 在我的应用程序周围传递对象数组