Sonata Admin启用操作

时间:2014-09-26 09:54:29

标签: symfony sonata-admin

我使用Symfony创建一个网站,我安装了sonata admin Bundle。 我有一个带有布尔变量的实体(启用)。 我想当这个变量将状态改为True时,同一个表的另一个变为False。实际上,我希望同一个表中只有一个变量(启用)为True。

所以我想在我的实体中直接更改setEnable,但是我无法从我的Entity类中获取存储库。

如何从我的实体类中获取我的存储库?

2 个答案:

答案 0 :(得分:1)

您应该使用lifecycleCallbacks来执行此操作(使用preUpdate),检查doc以获得良好的配置。 并做这样的事情:

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

答案 1 :(得分:0)

我认为你可能会改变未来。 如果这种行为是你的应用程序的逻辑,那么最好做一个doctrine订阅者。因此,当您坚持或更新您的实体时,将会检查它。

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

        }
    }
}


}