2014-02-02 2 views
0

У меня есть два контроллера, один, которые регистрируют измененные объекты и поместить их в сессии:сохраняются и встраивание объектов из сеанса

public function update_accountAction(Request $request) 
{ 
    Try 
    { 
     $code = $request->request->get('code'); 
     $name = $request->request->get('name'); 

     $em = $this->getDoctrine()->getManager(); 
     $repo = $em->getRepository('NRtworksChartOfAccountsBundle:Accounttree'); 

     $to_change = new Accounttree(); 
     $to_change = $repo->findOneByCode($code); 

     $to_change->setName($name); 
     $to_change->setCode($code); 

     $session = $this->getRequest()->getSession(); 
     $entity_to_update = $session->get('entity_to_update'); 

     $counter = $session->get('number_of_changes'); 

     $entity_to_update[] = $to_change; 

     $counter = $counter +1; 

     $session->set('number_of_changes',$counter); 
     $session->set('entity_to_update',serialize($entity_to_update)); 


     $response = array("code" => 100, "success" => true, "modified" => $entity_to_update); 
     return new Response(json_encode($response)); 
    } 
    Catch(Exception $e) 
    { 
     $response = array("code" => 100, "success" => false, "error" => $e); 
     return new Response($response); 
    } 

} 

И еще одно, что петли на результатах, и если это на самом деле один из желаемый объект сохраняется. Наконец я промолчал.

public function save_changesAction() 
{ 
    Try 
    { 
     $em = $this->getDoctrine()->getManager(); 

     $session = $this->getRequest()->getSession(); 

     $entity_to_update = unserialize($session->get('entity_to_update')); 


     foreach($entity_to_update as $account) 
     { 
      if($account->getId()) 
      {      
       $em->persist($account); 
       echo $account->getId(); 
      } 
      else 
      { 
        echo "error"; 
      } 
     } 

     $em->flush(); 
     $response = array("code" => 100, "success" => true, "modified" => $account->getId()); 
     return new Response(json_encode($response)); 
    } 
    Catch(Exception $e) 
    { 
     $response = array("code" => 100, "success" => false, "error" => $e); 
     return new Response($response); 
    } 

} 

Так что результат этого: ContextErrorException: Примечание: Undefined индекс: 000000007a60b041000000007ae6afd8 в /home/eagle1/www/Symfony24/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php линии 2852

Я не понимаю, почему, потому что кажется, что я получаю обратно полностью функциональный объект (я могу выполнять свои функции, доступ к его собственности и, кажется также, что упорствовать работает ...

Кто-нибудь знает ответ

+0

Что находится в строке 2852? – loveNoHate

+0

Есть ли конкретная причина, по которой вы не просто сохраняете идентификатор объекта вместе с двумя строками (имя и код) в сеансе ... вместо этого вы пытаетесь сохранить полный объект (со всеми материалами прокси-доктрины)? вы можете легко просто извлечь объекты из хранилища в свое действие save-action. – nifr

+0

Вы правы для этого случая, я мог бы сделать, как вы говорите. Однако, когда я захочу изменить родителя, мне придется иметь сущность. Если я не могу установить родителя самостоятельно (не используя метод addchild, рекомендованный в документе) – Eagle1

ответ

2

Когда вы вытаскиваете объект из сеанса, он не управляется доктриной. Вам нужно объединить его, чтобы уведомить об этом менеджера сущности.

if($account->getId()) 
{      
    $account = $em->merge($account); 
    $em->persist($account); 
    echo $account->getId(); 
} 

Доктрина имеет раздел руководства для Entities in the Session

Смежные вопросы