標題很好地解釋了這個問題。我處於Doctrine Entity類的生命週期回調中,並想要執行一些額外的數據庫條目。爲此,我需要獲取內核的一個實例。我怎樣才能做到這一點?如何在Symfony2的實體類中獲得內核的實例
3
A
回答
6
孤男寡女在一個實體的容器/內核的大部分時間,錯誤。一個實體不應該知道任何服務。這是爲什麼?
基本上,一個實體是一個代表事物的對象。一個實體主要用在一個關係數據庫中,但是你可以隨時使用這個實體來處理其他事情(序列化它,從HTTP層實例化...)。
您希望您的實體可以進行單元測試,這意味着您需要能夠輕鬆實例化您的實體,而無需任何東西,大部分都沒有任何業務邏輯。
你應該將自己的邏輯轉移到另一個層面,這個層面可以實現你的實體。
對於您的使用案例,我認爲,最簡單的方法是使用doctrine event。
services.yml
services:
acme_foo.bar_listener:
class: Acme\FooBundle\Bar\BarListener
arguments:
- @kernel
tags:
- { name: doctrine.event_listener, event: postLoad }
的Acme \ FooBundle \酒吧\ BarListener
use Symfony\Component\HttpKernel\KernelInterface;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Acme\FooBundle\Entity\Bar;
class BarListener
{
protected $kernel;
/**
* Constructor
*
* @param KernelInterface $kernel A kernel instance
*/
public function __construct(KernelInterface $kernel)
{
$this->kernel = $kernel;
}
/**
* On Post Load
* This method will be trigerred once an entity gets loaded
*
* @param LifecycleEventArgs $args Doctrine event
*/
public function postLoad(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
if (!($entity instanceof Bar)) {
return;
}
$entity->setEnvironment($this->kernel->getEnvironment());
}
}
而且你去那裏,你的實體仍然平整無依賴性,和你可以很容易地單元測試你的事件監聽器
1
- 如果您必須使用某些服務,則不應該特別使用整個容器或內核實例。
- 使用的服務本身 - 總是試圖注入單一的服務,而不是整個容器
- 你的情況看起來像你應該使用doctrine events
相關問題
- 1. 如何在Extjs中獲得類實例?
- 2. Symfony2在另一個實體中獲取實體的實體
- 3. 如何獲得註冊的實體列表中的Symfony2
- 4. 如何獲得一個類的實例?
- 5. 如何獲得一個類的實例?
- 6. 如何獲得類的實例
- 7. 如何獲得另一個實體內的實體?
- 8. Symfony2的組件,類實例
- 9. 如何獲得與Symfony2的形式提交了實體的Id
- 10. Symfony2/Doctrine:如何從實體類中堅持一個實體?
- 11. 如何獲得在類中確定的對象的實例
- 12. 如何獲得MBean綁定類實例
- 13. 如何獲得ES6類實例
- 14. symfony2切換案例實體
- 15. 如何獲得Hadoop中的JobTracker實例?
- 16. 如何在Django的ModelForm獲得實例
- 17. 實體中的多對多實體(symfony2)
- 18. 如何獲得GAE中的父實體?
- 19. 如何在Symfony 2的Form(Type)類中獲取實體庫的實例?
- 20. 如何獲得simple_html_dom函數的實例在類中使用
- 21. 如何在symfony2中的控制器中獲取實體
- 22. 如何確保核心數據實體的單個實例
- 23. 如何在類的實例中聲明類的實例?
- 24. 如何覆蓋Symfony2中的實體
- 25. 如何獲得ef核心上的依賴實體?
- 26. 如何在實體類中使用實體上下文以獲得性能?
- 27. 如何在Symfony2中構造實體
- 28. 獲得實例
- 29. 如何獲得給定類名的類的實例?
- 30. Ninject從內核獲取實例
我認爲你做錯了,你不應該需要一個實體中的內核。你的用例是什麼? – Touki
在回調中,我需要做一些數據庫操作以保持一些內部的一致性。爲了完成這些數據庫操作,我需要獲取對象管理器的實例並獲取OM(它被註冊爲服務)的實例,我需要內核實例。 –
有**必須**是使用LifecycleCallbacks的另一種方法。一個* postLoad事件監聽器*怎麼樣?在那裏你可以很容易地給你的構造函數中的內核實例的對象管理器,而不是打破標準? – Touki