使用会话Symfony时保存元素


Save elements when using the session Symfony

我正在尝试使用Symfony会话。事实上,我想在登录之前完成一个表单。

基于这个原因,我喜欢这样的方案:

  1. 保存会话中的不同字段
  2. 登录/注册
  3. 保存在数据库


My controller:

    public function customMadeAction(Request $request)
    {
        $session = $this->container->get('session');
        $user = $this->container->get('security.context')->getToken()->getUser();
        $CustomMade = new CustomMade();
        $form = $this->createForm(new CustomMadeType(), $CustomMade);
        $form->handleRequest($request);
        if ($user === 'anon.') {
            if($form->isValid()) {
                # 1-Save in session
                var_dump($CustomMade); #I have an array with all I need
                $session->set('infos', $CustomMade); #It does not save my informations
                # 2-Redirect to login/register
                $securityContext = $this->container->get('security.context');
                if (!$securityContext->isGranted('ROLE_USER')) {
                    throw new AccessDeniedException('Accès refusé');
                } else {
                # 3-Save in database
                $em = $this->getDoctrine()->getManager();
                $em->persist($CustomMade);
                $em->flush();
                }
            }
        }else{
            if($form->isValid()) {
                $CustomMade->setIdUser($user->getId());
                $em = $this->getDoctrine()->getManager();
                $em->persist($CustomMade);
                $em->flush();
            }
        }
        return $this->render('FrontBundle:Forms:customMade.html.twig', array(
            'form' => $form->createView()
        ));
    }

我不认为你可以在会话中存储对象。以下是一些解决方案:

  1. 在会话中手动存储对象的每个字段
  2. 序列化对象并将其保存在会话
  3. 将其存储在数据库中,并标记它尚未附加到用户,并将id保存在会话
  4. 中。

在我看来,1是最快实现的,但如果以后向实体添加字段,维护它将是一件痛苦的事情。解决方案2更好,但是反序列化不是那么容易。我认为方案3是最好的,它实现起来并不复杂,也不会造成任何维护问题。

如果你想保存数据,只保存输入数据从表单(验证后),而不是整个实体(可能有很多…妈的,除非这是你想要的)。

你可以将对象/数组设置到会话中,Symfony会为你序列化和反序列化它

如果是这种情况,替换

$session->set('infos', $CustomMade);

$session->set('infos', $form->getData());

这样你以后就可以简单地做:

$data = $session->get('infos');

安托万的解决方案是正确的,

您必须序列化对象以便能够将其存储在会话中。
最简单的方法应该是使用JMSSerializerBundle和将对象解码为json:

$serializer = $this->container->get('serializer');
$jsonDecoded = $serializer->serialize($doctrineobject, 'json');

顺便说一句。如评论中所述,这将序列化连接到实体的整个学说结构。
然而,toArray()函数可以在实体中实现,以便仅序列化数组结构,但是在处理oneToOne oneToMany和manymany关系时,这种方法变得非常复杂