如何在我自制的服务中使用 getContainer()



我想在自制服务中使用实体管理器

在我的配置中

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。 更好的是注入您需要的任何实体存储库。

相关内容

  • 没有找到相关文章