2012-10-15 185 views
5

使用symfony2。我有一個試圖調用從不同的類(控制器)的方法,像這樣的監聽器類:'調用成員函數get()非對象'?

 $authenticate = new AuthenticationController(); 
     $authenticate->isTokenValid($token); 

而且控制器isTokenValid方法:

public function isTokenValid($token) { 

    $conn = $this->get('database_connection'); 

拋出錯誤

Fatal error: Call to a member function get() on a non-object in /home/content/24/9254124/html/newsite/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php on line 246 

如果我加載控制器方法的正確方法(使用路由在url中)它工作正常。

+0

測試用例需要 –

+0

@LightnessRacesinOrbit原諒我? –

+0

有些問題呢? –

回答

7

Symfony2的使用依賴注入模式,你必須注入容器中保存的所有服務(如數據庫連接):

$authenticate = new AuthenticationController(); 
$authenticate->setContainer($this->container); 
$authenticate->isTokenValid($token); 

當然我這裏假設你的監聽器類是ContainerAware

[+]爲了讓你的聽衆ContainerAware,通過@service_container給它(例如形式services.yml

my.listener: 
    class: ACME\MyBundle\ListenerController 
    arguments: [ @service_container ] 
    tags: 
     - { name: kernel.event_listener, event: kernel.controller, method: onKernelController } 
    kernel.event_listener: 
     event: kernel.controller 

,然後在你監聽器類的構造函數:

public function __construct($container = null){ 
    $this->container = $container; 
} 
+0

其實,我不認爲它的containeraware,它扔了錯誤'未定義的屬性:$ container' .. –

+0

看到我編輯的答案 –

+0

不錯。我明白你的意思了。 「[@service_container]」是字面意思,還是應該用某種東西替換它?請原諒我不瞭解什麼是容器.. –

3

我加入另一個答案,因爲什麼@開發無效居民顧名思義就是一種不好的做法:在幾乎所有情況下,你最好僅注入你需要的服務 - 不是整個容器:

use Doctrine\DBAL\Connection; 

public function __construct(Connection $connection) 
{ 
    $this->connection = $connection; 
} 
my_listener: 
    arguments: [ @database_connection ] 
相關問題