如何从任何地方访问Service容器实例?

时间:2014-07-29 01:20:25

标签: php symfony dependency-injection

好的,我有ZF2的背景,但Symfony 2对我来说似乎有点奇怪...... 关于服务我的问题:

应该服务是全球性的。为什么只能从控制器访问它们? 我们假设我有这样的事情:

src/Acme/AcmeBundle
   /Acme/SomeClass.php

如何从SomeClass.php访问Container服务(即:$ this-> get / $ this-> container)?

3 个答案:

答案 0 :(得分:3)

除非你有充分的理由这样做(非常罕见的情况),否则你根本不应该直接使用容器。从控制器内部访问容器只是为了方便,但我仍然认为这是一种不好的做法。

在大多数情况下,您应该将自定义类注册为服务,并依赖于框架,第三方软件包或您自己提供的特定服务:

// your service

namespace Acme;

class SomeClass {
    private $serviceA;
    private $serviceB;
    private $param;

    public function __construct(A $serviceA, B $serviceB, $param = 0) {
        $this->serviceA = $serviceA;
        $this->serviceB = $serviceB;
        $this->param = $param;
    }

    public function doSth() {
        // ...
    }
}

// service definition for container

<service id="my_service" class="Acme\SomeClass">
    <argument type="service" id="some_service_a" />
    <argument type="service" id="some_service_b" />
    <argument>123</argument>
</service>

答案 1 :(得分:0)

您必须使用依赖注入。假设你有一个类src / Acme / AcmeBundle / SomeClass.php而不是setContainer函数

<?php

namespace Acme\AcmeBundle;

use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

class SomeClass implements ContainerAwareInterface
{

/**
 *
 * @var ContainerInterface
 */
protected $container;

/**
 * Sets the Container associated with this Controller.
 *
 * @param ContainerInterface $container A ContainerInterface instance
 */
 public function setContainer(ContainerInterface $container = null)
 {
  $this->container = $container;
 }

....
}

现在你可以定义&#34; SomeClass&#34;作为服务并注入这样的服务容器。

<service id="some.service.id" class="Acme\AcmeBundle\SomeClass">
      <call method="setContainer">
         <argument type="service" id="service_container"/>
      </call>
</service>

之后&#34; SomeClass&#34;可以通过服务容器访问&#34; some.service.id&#34;并将服务容器注入其中。

答案 2 :(得分:0)

几周前,我写了一篇关于如何注入服务容器的帖子。

链接: - http://anjanasilva.com/blog/injecting-services-in-symfony-2/

顺便说一下,小心使用注入服务容器可能不是最佳方法。

希望这会有所帮助 此致