我使用Symfony创建一个网站,我安装了sonata admin Bundle。 我有一个带有布尔变量的实体(启用)。 我想当这个变量将状态改为True时,同一个表的另一个变为False。实际上,我希望同一个表中只有一个变量(启用)为True。
所以我想在我的实体中直接更改setEnable,但是我无法从我的Entity类中获取存储库。
如何从我的实体类中获取我的存储库?
答案 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();
}
}
}
}