2015-07-20 67 views
3

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

出于这个原因,我想这个方案:
使用会话时保存元素Symfony

  1. 保存在数据库中


在会话中不同领域

  • 登录/注册
  • 保存我的控制器:

    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() 
         )); 
        } 
    
  • 回答

    2

    如果你想保存数据,从表单(验证后)数据保存输入,而不是完全实体(有可能是很多......妈的,除非那是什么你要)。

    您可以将对象/数组只设置到会话和Symfony的需要序列化和反序列化它为您

    的护理如果是这样的情况下,更换

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

    通过

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

    这样你会稍后简单地做:

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

    由于这是公认的答案我想它的工作原理。你能给我一个链接到它提到这个自动序列化的文档吗?我无法找到任何。 – AntoineWDG

    3

    我不认为你可以在会话中存储一个对象。 这里有几个解决方案:

    1. 店手动每个会话
    2. 你的对象领域的序列化的对象,并将其
    3. 店将其保存在会话中有标志的数据库,称这是不然后附加到一个用户,并保存在会话中的ID

    正如我所见,1是最快实施,但它将是一个痛苦,如果你后来添加字段到您的实体。解决方案2更好,但反序列化并不容易。我认为解决方案3是最好的,实施起来并不复杂,不会造成任何维护问题。

    2

    安东尼的解决方案是正确的,

    你将不得不序列化对象,以便能够将其存储在会话中。
    最简单的方法应该使用JMSSerializerBundle解码你的对象为JSON

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

    顺便说一句。如评论中所述,这将序列化连接到实体的整个学说结构。
    但是一个指定者()函数可以落实到实体,以连载只有一个阵列结构,但oneToOne一对多和多对多的关系打交道时,这种方法就变得非常复杂

    +0

    如果你尝试序列化一个学说对象,这意味着可能序列化实体管理器...?除非如果序列化程序做正确的工作,我不知道 –

    +0

    我发现这个http://doctrine-orm.readthedocs.org/en/latest/reference/architecture.html#serializing-entities所以是不会recomanded –

    +0

    谢谢对于提示...你是绝对正确的可能,但它确实会序列化整个实体经理......我会尽快更新答案,只要我在我的电脑前 – Nickolaus