如何在自定义类中获取服务(依赖项)

时间:2011-12-24 02:55:30

标签: symfony

在控制器中,我可以做到

$this->get('service.name')

但是在自定义课程中,我该怎么做?

5 个答案:

答案 0 :(得分:26)

将自定义类定义为服务,然后将依赖项注入其中。

例如:

// services.yml
services:
   my.custom.service.id:
       class: My\Custom\Class
       arguments:
         - @service.name
         - @doctrine.orm.entity_manager

然后,您的自定义类构造函数会将这些服务作为参数获取。

请务必阅读官方文档中的服务容器。它非常详细地讨论了所有这些。

答案 1 :(得分:8)

您使用ContainerAware进入了正确的轨道。

$this->get('id')实际上是$this->container->get('id')的快捷方式。将容器放入您的班级就像实施ContainerAwareInterface一样简单 - 将此片段放入您的班级:

public function setContainer(\Symfony\Component\DependencyInjection\ContainerInterface $container = null)
{
    $this->container = $container;
}

答案 2 :(得分:0)

如果您不知道创建服务时所需的完整依赖项列表,则可以将容器作为参数传递http://symfony.com/doc/current/book/service_container.html#using-the-expression-language

services:  
    service_name:  
        class: AppBundle\Class  
        arguments: ['@=container']

答案 3 :(得分:-2)

在自定义类(不在服务定义的类中)中访问服务容器

这不是最好的做法,但它有效。如果您的自定义类未设置为服务,则可以使用全局变量$ kernel:

访问服务容器
class Helper {

    private $container;

    /**
     * Constructor assigns service container to private container. 
     */
    public function __construct() {

        global $kernel;
        $this->container = $kernel->getContainer();

    }

    function doSOmething() {
        $someService = $this->container->get('service.name');
        // do something with someService ...
    }

}

答案 4 :(得分:-3)

好的,我想@Arms的回答是一个可能的解决方案,我通过查看Controller的来源找到了,我可以扩展ContainerAware