【问题标题】:How to pass correctly object using redirectToRoute?如何使用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 的参数之前,我已经在 stackoverflow 上发红了。我认为这是一个很好的解决方案,但它增加了我检查用户是否没有更改 URL 中的 ID 以显示其他对象的责任。

最好的方法是什么?

最好的问候, L.

【问题讨论】:

    标签: symfony


    【解决方案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
    猜你喜欢
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    相关资源
    最近更新 更多