Symfony:为什么方法$ this-> get()在构造函数中不可用?

时间:2014-06-17 14:59:07

标签: symfony translation

我的Controller的构造函数如下:

function __construct(){#
    var_dump($this->get('translator'));
    exit();
}

这将给出FatalErrorException: Error: Call to a member function get() on a non-object。但为什么?如果我在一个动作中使用它,它将起作用。

2 个答案:

答案 0 :(得分:1)

基本控制器的方法get()$this->container->get($id);的快捷方式。 $this->container设置在控制器的父级之一 - abstract class ContainerAware中。所以, 直到对象构造完成,没有Controller对象具有get()方法。通常,container的构造函数中不提供Controller

答案 1 :(得分:0)

这是因为Controller方法get需要container属性。控制器扩展ContainerAware,其方法为setContainer。此方法允许属性container知道Container 实例化时,不会调用任何方法,这是工作流程

$controller = new MyController($parameters);
$controller->setContainer($container);

在调用__construct之前,controller没有属性$container

public function __construct($parameters)
{
    var_dump($this->container); // NULL
}

所以,通过调用$this->get()你正在做

$this->get('translator');
// =
$this->container->get('translator');
// =
null->get('translator');

因此错误。

如果您需要验证器,则必须在构造函数中询问它(并尊重Law of Demeter)。
为此,您需要declare your controller as a service

services.yml

services:
    my_controller:
        class: Acme\FooBundle\Controller\MyController
        arguments:
            - "@translator"
        calls:
            - [ "setContainer", [ "@service_container" ] ]

的routing.yml

bar_route:
    path: /bar
    defaults: { _controller: my_controller:barAction }

myController的

class MyController extends Controller
{
    protected $translator;

    public function __construct(TranslatorInterface $translator)
    {
        $this->translator = $translator;
    }
}