如何使用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正确传递对象?的主要内容,如果未能解决你的问题,请参考以下文章

应该如何使用 RedirectToRoute?

如何正确传递 immutablejs 对象

Angular - 如何正确使用服务、HttpClient 和 Observables 在我的应用程序周围传递对象数组

如何在 UIPageViewController 和孩子之间正确传递对象

如何正确传递带有 var 前缀的对象类型的参数?

方法redirectToRoute() 可以有render() 之类的参数吗?