我无法访问控制器中的容器

Emi*_*aos 8 dependency-injection symfony

我正在尝试访问Symfony控制器中的服务

$session = $this->get('session');
Run Code Online (Sandbox Code Playgroud)

但我得到了下一个错误:

PHP Fatal error: Call to a member function get() on a non-object
Run Code Online (Sandbox Code Playgroud)

我认为Symfony2默认将控制器定义为服务.

注意:这个问题最初是由Dbugger提出的,但他已经无缘无故地删除了它,而它已经得到了解答.

Emi*_*aos 16

在控制器中使用容器

get()只是Symfony基本Controller类提供的快捷功能来访问容器.

您的控制器必须扩展此类才能使用此功能:

namespace Acme\ExampleBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{
    // your actions
}
Run Code Online (Sandbox Code Playgroud)

如果你不想依赖这个类(由于某些原因),你可以扩展 ContainerAware以获取容器注入并像在get()快捷方式中一样使用它:

namespace Acme\ExampleBundle\Controller;
use Symfony\Component\DependencyInjection\ContainerAware;

class DefaultController extends ContainerAware
{
    public function exampleAction()
    {
        $myService = $this->container->get('my_service');

        // do something
    }
}
Run Code Online (Sandbox Code Playgroud)

自己创建控制器

控制器未定义为默认服务,您可以定义它们,但不需要获取容器.如果发出请求,则路由框架确定需要调用的控制器.然后构造控制器并通过该setContainer()方法注入容器.

但是如果你自己构建控制器(在测试中或其他任何地方),你必须自己注入容器.

$controller = new DefaultController();
$controller->setContainer($container);
// $container comes trough DI or anything else.
Run Code Online (Sandbox Code Playgroud)