我想在自制服务中使用实体管理器
在我的配置中
services:
myfunc:
class: AcmeTopBundleMyServicesMyFunc
arguments: []
in Acme\TopBundle\MyServices\MyFunc.php
namespace AcmeTopBundleMyServices;
use DoctrineORMEntityManager;
class MyFunc
{
public $em;
public function check(){
$this->em = $this->getContainer()->get('doctrine')->getEntityManager(); // not work.
.
.
当我调用方法检查()时它显示错误。
Call to undefined method AcmeTopBundleMyServicesMyFunc::getContainer()
如何在 myFunc 类中使用 getContainer()?
由于您(幸运的是)没有在 myfunct
服务中注入容器,因此服务中没有对该容器的可用引用。
您可能不需要通过服务容器获取实体管理器!请记住,DIC允许您通过仅注入他们需要的相关服务来自定义您的服务(在您的情况下是实体经理)
namespace AcmeTopBundleMyServices;
use DoctrineORMEntityManager;
class MyFunc
{
private $em;
public __construct(EntityManager $em)
{
$this->em = $em;
}
public function check()
{
$this->em // give you access to the Entity Manager
您的服务定义,
services:
myfunc:
class: AcmeTopBundleMyServicesMyFunc
arguments: [@doctrine.orm.entity_manager]
也
- 考虑使用"通过 setter 注入",以防处理可选依赖项。
你需要让 MyFunc 成为"容器感知":
namespace AcmeTopBundleMyServices;
use SymfonyComponentDependencyInjectionContainerAware;
class MyFunc extends ContainerAware // Has setContainer method
{
public $em;
public function check(){
$this->em = $this->container->get('doctrine')->getEntityManager(); // not work.
您的服务:
myfunc:
class: AcmeTopBundleMyServicesMyFunc
calls:
- [setContainer, ['@service_container']]
arguments: []
我应该指出,注射容器通常不是必需的,而且是不受欢迎的。 您可以将实体管理器直接注入 MyFunc。 更好的是注入您需要的任何实体存储库。