Symfony Sonata管理启用操作

Symfony Sonata管理启用操作,symfony,sonata-admin,Symfony,Sonata Admin,我正在使用Symfony创建一个网站,并安装了sonata管理包。 我有一个带有布尔变量(enable)的实体。 我希望当这个变量的状态变为True时,同一个表的另一个变为False。事实上,我只希望同一个表的一个变量(enable)为True 所以我想直接在实体中更改setEnable,但我无法从实体类中获取存储库 如何从实体类获取存储库?您应该使用lifecycleCallbacks来完成此操作(使用预更新),请检查文档以获得良好的配置。 这样做: public function pr

我正在使用Symfony创建一个网站,并安装了sonata管理包。 我有一个带有布尔变量(enable)的实体。 我希望当这个变量的状态变为True时,同一个表的另一个变为False。事实上,我只希望同一个表的一个变量(enable)为True

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


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

您应该使用lifecycleCallbacks来完成此操作(使用预更新),请检查文档以获得良好的配置。 这样做:

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

我想你可能会改变看法。 如果此行为是应用程序的逻辑,那么最好执行以下操作。因此,当您持久化或更新您的实体时,将对其进行检查

看看

在您的特定情况下,这将通过以下简单代码完成:

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

        }
    }
}


}

好的,谢谢,我用@ORM\PreUpdate()注释将它放在我的实体类中。现在我的第二个问题是如何访问该实体的其他对象以更新它们?因为我不能在实体类中使用getEntityManager()。您不需要使用EntityManager,我编辑了我的第一篇文章,请检查。但我想更改表的其他对象。例如$object1->setVariable(false)$object2->setVariable(false)$此->设置变量(true);