Symfony 3 如何通过重定向传递对象

3

我目前正在学习Symfony表单。但我遇到了一些问题,代码并没有按照我的预期工作。 我试图让用户向我的默认控制器提交数据,如果这些数据有效,就将其重定向到另一种方法,以便我可以像将该数据提交到数据库那样执行操作。

我遇到的问题是如何传递数据,这些数据是一个带有简单名称和日期字段的Task对象,传递到另一个命名路由。

以下是我编写的一些代码,只是作为类似结构的基本表单。

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

所以,正如您所看到的,我只是将任务作为数组传递进来。在这段代码中,我认为也许可以通过请求访问任务,但那似乎行不通。当我尝试在successAction中添加一个Task[] $task参数时,找不到任务。
那么,在第二个操作中有没有一种方法可以访问对象?还是我有点反向?我应该在重定向之前插入数据或进行任何其他数据操作吗?还是有一种方法将Task对象传递给控制器中的另一个方法,以便我可以在那里处理数据?
感谢您的帮助。

你的成功操作必须使用任务参数(一个id或其他)之后,你可以使用ParamConverter将此id转换为任务对象。http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html - COil
1个回答

8

由于路由“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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接