2011-12-24 34 views

回答

24

将您的自定义类定义为服务,然后向其中注入依赖关系。

例:

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

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

请务必在官方文档中阅读服务容器。它详细讲述了所有这些。

-3

OK,我想@Arms答案是一个可能的解决方案,我发现通过查看源Controller,我可以扩展ContainerAware

+2

请记住,如果你扩展'ContainerAware'您需要手动设置容器对象。如果你在没有访问容器的地方实例化你的自定义类,这是不可能的。 – 2011-12-24 05:06:43

+3

注入整个容器是一个坏主意。明确地在服务中注入您需要的每项服务。 – 2011-12-24 17:31:28

7

你是正确的轨道上ContainerAware。

$this->get('id')实际上是$this->container->get('id')的快捷方式。而让容器到类是为实现ContainerAwareInterface简单 - 把这个片段注入类:

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

对谁来说-1:我真的很喜欢解释你为什么认为我的答案是错的,什么是正确的答案。请记住,这个问题基本上是:“如何将服务容器注入到自定义类中?” – Inoryy 2011-12-24 19:41:37

+3

我不是那个downvoted的人,但最初的问题是如何访问自定义类中的服务,而不是如何注入服务容器(这被认为是不好的做法)。 – 2011-12-24 20:27:03

+5

他问如何访问服务中的自定义而不是如何向其中注入某种服务,他甚至从控制器中给出了一个例子,并且正在研究如何复制这种行为。仅仅因为它是一种情况糟糕的做法而降低一个完全正确的答案是非常错误的,因为我们没有给出一个完整的用例来决定。所以我真的希望这不是-1背后的原因。 – Inoryy 2011-12-24 23:10:31

-2

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

这并不是做得最好的做法,但它的工作原理。如果您的自定义类未设置为一个服务,那么你可以使用全局变量$内核访问服务容器:

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 ... 
    } 

} 
+0

omg,在symfony中使用全局变量看起来不太好 – Eddie 2017-10-18 07:21:27

+0

它的工作原理...所以这是一个有效的解决方案,不是最佳实践,但仍然 – DevWL 2017-10-18 19:41:17

+0

“它的工作原理”是不够的 – Eddie 2017-10-19 09:48:19