2014-09-26 3 views
0

Я использую Symfony для создания веб-сайта, и я установил пакет sonata admin Bundle. У меня есть сущность с булевой переменной (enable). Я хотел бы, когда эта переменная изменится на True, другая для той же таблицы перейдет в False. На самом деле я бы хотел, чтобы только одна переменная (enable) для той же таблицы находилась в True.Sonata Admin Enable action

Поэтому я решил изменить setEnable непосредственно в моем Entity, но я не могу получить репозиторий из моего класса Entity.

Как я могу получить свой репозиторий из своего класса Entity?

ответ

1

Для этого необходимо использовать lifecycleCallbacks (с preUpdate), проверьте документ для хорошей конфигурации. А делать что-то вроде этого:

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

Ok спасибо, я положил его в Entity класса с @ORM \ PreUpdate() аннотаций , Моя вторая проблема заключается в том, как я могу получить доступ к моим другим объектам этого объекта для их обновления? Причина Я не могу использовать getEntityManager() в классе Entity. –

+0

Вам не нужно использовать EntityManager, я отредактировал свой первый пост, проверьте его. – Aximem

+0

Но я хотел бы изменить другие объекты таблицы. Например, $ object1-> setVariable (false); $ Object2-> SetVariable (ложь); $ This-> SetVariable (истина); –

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(); 

     } 
    } 
} 


}