如何使用不属于路由的参数重定向ttoroute()


How to redirectToRoute() with arguments which are not part of the route?

我有一个控制器与两个...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');
    // ...
}

另一个解决方案是使用serializeunserialize函数:

$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));
}