我正试图从控制器外部获得一些服务(例如会话)。
请解释如何正确地做到这一点。
答案 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。