我正在使用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