2015-07-20 66 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