我我的控制器的構造是這樣的:
function __construct(){#
var_dump($this->get('translator'));
exit();
}
這會給一個FatalErrorException: Error: Call to a member function get() on a non-object
。但爲什麼?如果我在動作中使用它,它會起作用。
我我的控制器的構造是這樣的:
function __construct(){#
var_dump($this->get('translator'));
exit();
}
這會給一個FatalErrorException: Error: Call to a member function get() on a non-object
。但爲什麼?如果我在動作中使用它,它會起作用。
這是因爲Controller方法get
需要container
屬性。控制器擴展爲ContainerAware,其方法爲setContainer
。此方法讓屬性container
知道該容器。
在instanciation,沒有一種方法是所謂的,這裏是工作流程
$controller = new MyController($parameters);
$controller->setContainer($container);
調用__construct之前,控制器有沒有財產$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 }
MyCont輥
class MyController extends Controller
{
protected $translator;
public function __construct(TranslatorInterface $translator)
{
$this->translator = $translator;
}
}
謝謝。我將尋找一種方法來與翻譯人員認識到這一點。 – user3631654
@ user3631654用Translator更新。 – Touki
基本控制器的方法get()
是$this->container->get($id);
的快捷方式。 $this->container
在控制器的其中一個父項中設置 - abstract class ContainerAware
。所以, ,直到對象結構完成,沒有Controller
對象,將有get()
方法。一般而言,container
不適用於Controller
的構造函數。
但是,如果我調用父構造函數來完成構建,它也將無法工作。 – user3631654
這不起作用。這是事實,'容器'在Controller的構造函數中不可用。 – dmnptr
這是相當奇怪的叫'出口();'在構造函數中。 – Unda
只是爲了隔離其他控制器的動作... – user3631654
var_dump($ this) –