Symfony2中的服务

时间:2012-03-02 10:43:01

标签: php service dependency-injection symfony

我正试图从控制器外部获得一些服务(例如会话)。

请解释如何正确地做到这一点。

1 个答案:

答案 0 :(得分:3)

有许多不同的方式,都有利有弊。

首先,每个服务都是某种对象,所以你总是可以自己创建有问题的对象。您可能被迫处理许多引用,但这是可能的。这破坏了依赖注入的概念,所以它不是你应该做的!

第二种方法是将服务注入您的班级:

class MyClass{

    public function __construct($session){
        // ...
    }
}

class MyContainer extends Controller{

    public function SomeKindOfAction(){
        $myClass = new MyClass($this->get('session'));
    }
}

如果您只在Controller中使用该类,则可能没问题。如果你有更多的嵌套关系,比如在MyClass中,你创建了另一个需要会话的类,你可能会遇到紧耦合(这是为了避免)以及复杂性问题。

最好的方法是创建自己的服务并注入您需要的东西。有很多文档,所以我只是举一个使用上面的MyClass的简短例子。

services.yml:

services:
    my.myClass:
        class: /Acme/DefaultBundle/MyStuff/MyClass
        arguments: ["@session"]

现在你的班级就像服务一样(谁会觉得这很简单!)你可以在你的控制器中使用它:

class MyContainer extends Controller{

    public function SomeKindOfAction(){
        $myClass = $this->get('my.myClass');
    }
}

现在您不必考虑构造函数以及如何获取对象,DI-Container将为您完成。如果您想了解更多信息,请阅读here