我正在使用Symfony创建一个网站,并且我安装了sonata管理软件包。 我有一个布尔变量(启用)的实体。 我想当这个变量改变状态为True时,同一个表的另一个变为False。事实上,我想只有一个变量(启用)为同一个表是在真。Sonata Admin启用操作
所以我想直接在我的实体中更改setEnable,但是我无法从我的Entity类中获取存储库。
如何从我的实体类获取我的存储库?
我正在使用Symfony创建一个网站,并且我安装了sonata管理软件包。 我有一个布尔变量(启用)的实体。 我想当这个变量改变状态为True时,同一个表的另一个变为False。事实上,我想只有一个变量(启用)为同一个表是在真。Sonata Admin启用操作
所以我想直接在我的实体中更改setEnable,但是我无法从我的Entity类中获取存储库。
如何从我的实体类获取我的存储库?
您应该使用lifecycleCallbacks来执行此操作(使用preUpdate),检查doc以获取良好配置。 而做这样的事情:
public function preUpload()
{
if ($this->getVariable1())
$this->setVariable2(false);
}
我想你可能会改变预期。 如果这种行为是您的应用程序的逻辑,那么最好做一个教条订阅者。所以当你坚持或更新你的实体时,它将被检查。
看看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();
}
}
}
}
好的谢谢我把它放在我的@ORM \更新前的实体类()注释。我现在的第二个问题是如何访问本实体的其他对象以更新它们?原因我无法在实体类中使用getEntityManager()。 – 2014-09-26 13:17:27
你不需要使用EntityManager,我编辑我的第一篇文章,检查它。 – Aximem 2014-09-26 13:26:02
但是我想改变表格的其他对象。例如$ object1-> setVariable(false); $ object2-> setVariable(假); $这个 - > setVariable(真); – 2014-09-26 13:52:26