Symfony 3 通过重定向传递对象
Symfony 3 passing object through redirects
我目前正在学习 Symfony 表单。我遇到问题的代码无法按我希望的方式工作。我想要做的是让用户向我的默认控制器提交数据,如果数据有效,将其重定向到另一种方法,以便我可以执行类似将数据提交到数据库的操作。
我遇到的问题是将数据传递给另一个命名路由,这是一个具有简单名称和日期字段的任务对象。
这里是我写的一些代码,只是一个基本的形式,作为class种结构。
TaskType.php
namespace AppBundle\Entity\Forms;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use AppBundle\Entity\Forms\Task;
use Symfony\Component\OptionsResolver\OptionsResolver;
class TaskType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('task', TextType::class)
->add('dueDate', DateType::class, array('label' => 'Register'))
->add('save', SubmitType::class)
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Task::class,
));
}
DefaultController.php
...
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use AppBundle\Entity\Forms\TaskType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
...
/**
* @Route("/", name="homepage")
*/
public function indexAction(Request $request)
{
$form = $this->createForm(TaskType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// $form->getData() holds the submitted values
// but, the original `$task` variable has also been updated
$task = $form->getData();
// ... perform some action, such as saving the task to the database
// for example, if Task is a Doctrine entity, save it!
// $em = $this->getDoctrine()->getManager();
// $em->persist($task);
// $em->flush();
return $this->redirectToRoute('success', array($task));
}
return $this->render('forms/task.html.twig', array(
'form' => $form->createView(),
));
}
/**
* @Route("/success", name="success")
*/
public function successAction(Request $request) {
dump($request);die;
}
因此,如您所见,我只是将任务作为数组传入。在这段代码中,我想也许我可以通过他的请求访问任务,但这似乎行不通。当我尝试将 Task[] $task 参数添加到 successAction 时,找不到任务。
那么有没有办法在第二个动作中访问这里的对象呢?或者我只是有点倒退在这里?我应该在进行重定向之前插入数据或任何其他数据操作吗?或者有没有办法将 Task 对象传递给控制器中的另一个方法,以便我可以在那里处理数据?
感谢您的意见
您传递的参数将被忽略,因为路由 "success" 不接受任何参数。另外我认为你不能传递对象。你可以序列化它,例如作为 json 字符串,然后反序列化它。
我认为您的方法的最佳选择是使用 Session 来保存数据(确保对象是可序列化的):
$this->container->get('session')->set('task', $task);
return $this->redirectToRoute('success');
然后在您的成功操作中检索它:
public function successAction(Request $request) {
$task = $this->container->get('session')->get('task');
if ($task === null || !$task instanceof Task) {
return $this->createNotFoundException();
}
// Do something
}
另见:https://symfony.com/doc/current/components/http_foundation/sessions.html#main
我目前正在学习 Symfony 表单。我遇到问题的代码无法按我希望的方式工作。我想要做的是让用户向我的默认控制器提交数据,如果数据有效,将其重定向到另一种方法,以便我可以执行类似将数据提交到数据库的操作。
我遇到的问题是将数据传递给另一个命名路由,这是一个具有简单名称和日期字段的任务对象。
这里是我写的一些代码,只是一个基本的形式,作为class种结构。
TaskType.php
namespace AppBundle\Entity\Forms;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use AppBundle\Entity\Forms\Task;
use Symfony\Component\OptionsResolver\OptionsResolver;
class TaskType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('task', TextType::class)
->add('dueDate', DateType::class, array('label' => 'Register'))
->add('save', SubmitType::class)
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Task::class,
));
}
DefaultController.php
...
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use AppBundle\Entity\Forms\TaskType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
...
/**
* @Route("/", name="homepage")
*/
public function indexAction(Request $request)
{
$form = $this->createForm(TaskType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// $form->getData() holds the submitted values
// but, the original `$task` variable has also been updated
$task = $form->getData();
// ... perform some action, such as saving the task to the database
// for example, if Task is a Doctrine entity, save it!
// $em = $this->getDoctrine()->getManager();
// $em->persist($task);
// $em->flush();
return $this->redirectToRoute('success', array($task));
}
return $this->render('forms/task.html.twig', array(
'form' => $form->createView(),
));
}
/**
* @Route("/success", name="success")
*/
public function successAction(Request $request) {
dump($request);die;
}
因此,如您所见,我只是将任务作为数组传入。在这段代码中,我想也许我可以通过他的请求访问任务,但这似乎行不通。当我尝试将 Task[] $task 参数添加到 successAction 时,找不到任务。
那么有没有办法在第二个动作中访问这里的对象呢?或者我只是有点倒退在这里?我应该在进行重定向之前插入数据或任何其他数据操作吗?或者有没有办法将 Task 对象传递给控制器中的另一个方法,以便我可以在那里处理数据?
感谢您的意见
您传递的参数将被忽略,因为路由 "success" 不接受任何参数。另外我认为你不能传递对象。你可以序列化它,例如作为 json 字符串,然后反序列化它。
我认为您的方法的最佳选择是使用 Session 来保存数据(确保对象是可序列化的):
$this->container->get('session')->set('task', $task);
return $this->redirectToRoute('success');
然后在您的成功操作中检索它:
public function successAction(Request $request) {
$task = $this->container->get('session')->get('task');
if ($task === null || !$task instanceof Task) {
return $this->createNotFoundException();
}
// Do something
}
另见:https://symfony.com/doc/current/components/http_foundation/sessions.html#main