如何从任何地方访问服务容器实例


How to access Service container instance from anywhere?

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

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

src/Acme/AcmeBundle
   /Acme/SomeClass.php

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

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

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

// 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>

你必须使用依赖注入。假设你有一个类src/Acme/AcmeBundle/somecclass .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;
 }
....
}

现在你可以将"SomeClass"定义为服务,并像这样注入服务容器。

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

之后,"SomeClass"可以通过服务容器通过"some.service "访问。

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

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

顺便说一下,注入服务容器要小心使用,因为这可能不是最好的方法。

希望这对你有帮助关于