我的Controller的构造函数如下:
function __construct(){#
var_dump($this->get('translator'));
exit();
}
这将给出FatalErrorException: Error: Call to a member function get() on a non-object
。但为什么?如果我在一个动作中使用它,它将起作用。
答案 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;
}
}