2013-09-25 46 views
8

我想在Symfony的控制器我必須容器中沒有訪問我的控制器

$session = $this->get('session'); 

訪問服務,但我得到了一個錯誤:

PHP Fatal error: Call to a member function get() on a non-object 

我認爲Symfony2的有控制器默認定義爲服務。

注意:這個問題最初是由Dbugger提問的,但他在無理由的情況下將其刪除,但它已經得到回覆。

回答

15

使用在控制器

get()容器是僅由Symfony base Controller class提供訪問容器的快捷方式功能。

你的控制器必須擴展這個類來使用此功能:

namespace Acme\ExampleBundle\Controller; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class DefaultController extends Controller 
{ 
    // your actions 
} 

如果你不想依賴於這個類(因爲某些原因),你可以擴展ContainerAware得到容器注入並使用它像get()快捷:

namespace Acme\ExampleBundle\Controller; 
use Symfony\Component\DependencyInjection\ContainerAware; 

class DefaultController extends ContainerAware 
{ 
    public function exampleAction() 
    { 
     $myService = $this->container->get('my_service'); 

     // do something 
    } 
} 

創建你自己的

控制器控制器不定義爲服務默認情況下,您可以定義它們,但不需要獲取容器。如果發出請求,路由框架將確定需要調用的控制器。然後控制器被構建並通過setContainer()方法注入容器。

但是,如果您自己構建控制器(在測試或其他任何地方),則必須自行注入容器。

$controller = new DefaultController(); 
$controller->setContainer($container); 
// $container comes trough DI or anything else. 
+1

從版本2.8開始不推薦使用,要在3.0中刪除。改爲使用ContainerAwareTrait。 – jan

+0

@jan你可以看到答案是多大?你可以看到這是一個社區維基條目?去和更新編輯該答案,而不是嘲笑它的棄用... –

相關問題