2014-09-26 61 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(); 

     } 
    } 
} 


}