2014-09-26 60 views
0

我正在使用Symfony創建一個網站,並且我安裝了sonata管理軟件包。 我有一個布爾變量(啓用)的實體。 我想當這個變量改變狀態爲True時,同一個表的另一個變爲False。事實上,我想只有一個變量(啓用)爲同一個表是在真。Sonata Admin啓用操作

所以我想直接在我的實體中更改setEnable,但是我無法從我的Entity類中獲取存儲庫。

如何從我的實體類獲取我的存儲庫?

回答

1

您應該使用lifecycleCallbacks來執行此操作(使用preUpdate),檢查doc以獲取良好配置。 而做這樣的事情:

public function preUpload() 
     { 
      if ($this->getVariable1()) 
       $this->setVariable2(false); 
     } 
+0

好的謝謝我把它放在我的@ORM \更新前的實體類()註釋。我現在的第二個問題是如何訪問本實體的其他對象以更新它們?原因我無法在實體類中使用getEntityManager()。 – 2014-09-26 13:17:27

+0

你不需要使用EntityManager,我編輯我的第一篇文章,檢查它。 – Aximem 2014-09-26 13:26:02

+0

但是我想改變表格的其他對象。例如$ object1-> setVariable(false); $ object2-> setVariable(假); $這個 - > setVariable(真); – 2014-09-26 13:52:26

0

我想你可能會改變預期。 如果這種行爲是您的應用程序的邏輯,那麼最好做一個教條訂閱者。所以當你堅持或更新你的實體時,它將被檢查。

看看http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html

在特定情況下,這將與這個簡單的代碼來完成:

use Doctrine\Common\EventSubscriber; 
use Doctrine\ORM\Event\LifecycleEventArgs; 


class ObjectSubscriber implements EventSubscriber 
{ 



public function __construct($objectManager) 
{ 
} 


public function getSubscribedEvents() 
{ 
    return array(
     'postPersist', 
     'postUpdate', 
    ); 
} 


public function postUpdate(LifecycleEventArgs $args) 
{ 
    $this->manage($args); 
} 

public function postPersist(LifecycleEventArgs $args) 
{ 
    $this->manage($args); 
} 

public function manage(LifecycleEventArgs $args) 
{ 
    $entity = $args->getEntity(); 
    if ($entity instanceof YourEntity) { 
     if ($entity->getEnable()) { 
      $em = $args->getEntityManager(); 
      $entities = $em->getRepository('YourEntityRepository')->findByEnable(true); 
      foreach ($entities as $e) { 
       if ($e->getId() == $entity->getId()) { 
        continue; 
       } 
       $e->setEnable(false); 
      } 
      $em->flush(); 

     } 
    } 
} 


}