2013-12-23 101 views
2

我想Symfony2的控制器擴展到我的項目正在使用的API,但我有一個非對象使用的getParameter()函數,看看我的代碼的錯誤:Symfony2的擴展控制器的getParameter()

namespace Moda\CategoryBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class ApiController extends Controller 
{ 
    /** 
    * @var String 
    */ 
    protected $_host; 

    /** 
    * @var String 
    */ 
    protected $_user; 

    /** 
    * @var String 
    */ 
    protected $_password; 

    public function __construct() 
    { 
     $this->_host = $this->container->getParameter('api_host'); 
     $this->_user = $this->container->getParameter('api_user'); 
     $this->_password = $this->container->getParameter('api_password'); 

    } 
} 

而旁邊控制器

namespace Moda\CategoryBundle\Controller; 

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; 

class CategoryController extends ApiController 
{ 
    /** 
    * @Route("/category", name="_category") 
    * @Template() 
    */ 
    public function indexAction() 
    { 
     return array('name' => 'test'); 
    } 

} 

而結束,我得到了這個致命錯誤:

FatalErrorException: Error: Call to a member function getParameter() on a non-object in (..)

我嘗試給我們e $ this-> setContainer()但它不起作用。你有什麼想法我該如何解決這個問題?

+1

您可以將ApiController定義爲服務。 –

+0

可能的重複http://stackoverflow.com/questions/9736598/symfony2-how-to-use-construct-in-a-controller-and-access-securty-context – Calimero

+0

@Calimero是的,主題是類似的。但我不明白答案。你看我想做什麼,在symfony中是否有辦法做到這一點?我試圖使用setContainer,但沒有幫助。 – Purzynski

回答

2

如果您的控制器未定義爲服務,則控制器的構造函數執行不會持久化。

您有兩個選項來解決您的情況:

  1. 定義控制器作爲服務,並注入需要使用依賴注入的參數。
  2. 在控制器或父抽象控制器中添加init方法,並調用init方法,然後才需要使這些參數可用;
1

你不能在控制器__construct中使用容器,原因是當構造函數調用where是沒有容器設置yeat。

您可以簡單地定義在控制一些簡單的方法,如

class ApiController extends Controller 
{ 
    protected function getApiHost() 
    { 
     return $this->container->getParameter('api_host'); 
    } 
} 
+0

即使注入容器,它仍然沒有在構造函數中工作。 目前只是在我的正常功能調用它們,谷歌相當一段時間這個特定的答案。 現在有沒有一種方法已知如何管理構造函數中的參數? – Robert

0

我不知道一些瘋狂喜歡這樣的工作?而不是重寫構造函數,重寫setContainer方法?我沒有嘗試過......只是大聲思考。

namespace Moda\CategoryBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\DependencyInjection\ContainerInterface; 


class ApiController extends Controller 
{ 
    /** 
    * @var String 
    */ 
    protected $_host; 

    /** 
    * @var String 
    */ 
    protected $_user; 

    /** 
    * @var String 
    */ 
    protected $_password; 


    public function setContainer(ContainerInterface $container = null) 
    { 
     parent::setContainer($container); 

     $this->_host = $this->container->getParameter('api_host'); 
     $this->_user = $this->container->getParameter('api_user'); 
     $this->_password = $this->container->getParameter('api_password'); 

    } 
}