Symfony 2典型的问题,但没有明确的答案(我做了一些研究)。
鉴于以下“DefaultController”类实际有效:
<?php
namespace obbex\AdsBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class DefaultController extends Controller
{
public function indexAction()
{
$em = $this->getDoctrine()->getEntityManager();
$connection=$em->getConnection();
$string="SELECT DISTINCT country_code FROM country_data";
$statement = $connection->prepare($string);
$statement->execute();
$result = $statement->fetchAll();
var_dump($result); //works not problem
die();
}
}
我想将数据库调用委托给另一个名为“DatabaseController”的类,“DefaultController”现在设置如下:
<?php
namespace obbex\AdsBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use obbex\AdsBundle\Controller\DatabaseController; //new DatabaseController
class DefaultController extends Controller
{
public function indexAction()
{
$dbController = new DatabaseController();
$res = $dbController->getQuery();
}
}
和“DatabaseController”设置如下:
namespace obbex\AdsBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class DatabaseController extends Controller{
public function __construct() {
}
public function getQuery()
{
$em = $this->getDoctrine()->getEntityManager();
$connection=$em->getConnection();
$string="SELECT DISTINCT country_code FROM country_data";
$statement = $connection->prepare($string);
$statement->execute();
return $statement->fetchAll();
}
}
此抛出和以下错误:FatalErrorException:错误:在/home/alfonso/sites/ads.obbex.com/public_html/vendor/symfony/symfony/中对非对象调用成员函数has() src / Symfony / Bundle / FrameworkBundle / Controller / Controller.php第202行
我现在正在思考,因为我正在扩展完全相同的类“控制器”。为什么它在一个案例中而不在另一个案例中工作?
显然,这是一个“容器问题”,可以根据另一个线程中的响应设置服务,或者通过扩展“控制器类”但在这种情况下不起作用。
答案 0 :(得分:0)
首先,你不应该将数据库管理委托给另一个控制器,这是一个不好的做法。
相反,您可以注入包含所有数据库逻辑的服务
Symfony2 Use Doctrine in Service Container
或使用EntityRepository
http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes
关于has()
函数的问题,您正在创建一个Controller的实例,而不包含任何容器。因此,当控制器尝试调用$this->container->has()
时会抛出错误,因为未定义容器。
答案 1 :(得分:0)
我终于设置了对象调用者,并按如下方式请求了容器服务:
在services.yml文件
上service:
manage_ads:
class: obbex\AdsBundle\Classes\ManageAds
calls:
- [setContainer, ["@service_container"]]
主控制器上的:
$ads_manager = $this->get('manage_ads');
$ads_manager->functionCallingTheRawQuery();
但我仍然可以选择使用它,因为现在我从实体的存储库设置我的查询而不是创建我自己的对象(现在,我是symfony2的新手)