我想将Symfony2 Controller扩展到我正在使用API的项目但是我有一个非对象错误使用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:错误:调用成员函数getParameter() 在(..)
中的非对象上
我尝试使用$ this-> setContainer()但它不起作用。你知道我怎么能解决这个问题呢?
答案 0 :(得分:3)
如果您的控制器未定义为服务,则控制器的构造函数执行不会保留。
您有两种方法可以解决您的情况:
答案 1 :(得分:1)
你不能在Controller __construct
中使用容器,原因是当构造函数调用where时没有容器集yeat。
你可以在控制器中简单地定义一些简单的方法,比如
class ApiController extends Controller
{
protected function getApiHost()
{
return $this->container->getParameter('api_host');
}
}
答案 2 :(得分: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');
}
}