2014-06-17 36 views
1

我我的控制器的構造是這樣的:

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

這會給一個FatalErrorException: Error: Call to a member function get() on a non-object。但爲什麼?如果我在動作中使用它,它會起作用。

+0

這是相當奇怪的叫'出口();'在構造函數中。 – Unda

+0

只是爲了隔離其他控制器的動作... – user3631654

+0

var_dump($ this) –

回答

0

這是因爲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; 
    } 
} 
+0

謝謝。我將尋找一種方法來與翻譯人員認識到這一點。 – user3631654

+0

@ user3631654用Translator更新。 – Touki

1

基本控制器的方法get()$this->container->get($id);的快捷方式。 $this->container在控制器的其中一個父項中設置 - abstract class ContainerAware。所以, ,直到對象結構完成,沒有Controller對象,將有get()方法。一般而言,container不適用於Controller的構造函數。

+0

但是,如果我調用父構造函數來完成構建,它也將無法工作。 – user3631654

+0

這不起作用。這是事實,'容器'在Controller的構造函數中不可用。 – dmnptr

相關問題