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

时间:2014-02-17 15:01:49

标签: symfony doctrine-orm

我想在自制服务中使用EntityManager

在我的config.yml

services:
    myfunc:
        class:   Acme\TopBundle\MyServices\MyFunc
        arguments: []

在Acme \ TopBundle \ MyServices \ MyFunc.php

namespace Acme\TopBundle\MyServices;
use Doctrine\ORM\EntityManager;

class MyFunc
{
    public $em;

    public function check(){
        $this->em = $this->getContainer()->get('doctrine')->getEntityManager(); // not work.
.
.

当我调用方法check()时显示错误。

Call to undefined method Acme\TopBundle\MyServices\MyFunc::getContainer()

如何在myFunc类中使用getContainer()?

2 个答案:

答案 0 :(得分:3)

由于您(幸运的是)没有在您的myfunct服务中注入容器,因此您的服务中没有可用的容器参考。

您可能不需要通过服务容器获取实体管理器!请记住,DIC允许您通过仅注入他们需要的相关服务(在您的情况下为实体经理)来定制您的服务。

namespace Acme\TopBundle\MyServices;

use Doctrine\ORM\EntityManager;

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:   Acme\TopBundle\MyServices\MyFunc
        arguments: [@doctrine.orm.entity_manager]

此外,

  • 如果您正在处理可选的依赖项,请考虑使用“通过setter注入”。

答案 1 :(得分:0)

你需要让MyFunc“容器识别”:

namespace Acme\TopBundle\MyServices;

use Symfony\Component\DependencyInjection\ContainerAware;

class MyFunc extends ContainerAware // Has setContainer method
{
    public $em;

    public function check(){
        $this->em = $this->container->get('doctrine')->getEntityManager(); // not work.

您的服务:

myfunc:
    class:   Acme\TopBundle\MyServices\MyFunc
    calls:
        - [setContainer, ['@service_container']]
    arguments: []

我应该指出,注射容器通常不是必需的,并且不赞成。您可以将实体管理器直接注入MyFunc。更好的方法是注入你需要的任何实体存储库。