Symfony 2的典型问题,但没有明确的响应(我做了一些研究)。
给定下面实际工作的"DefaultController"类:
<?php
namespace obbexAdsBundleController;
use SymfonyBundleFrameworkBundleControllerController;
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 obbexAdsBundleController;
use SymfonyBundleFrameworkBundleControllerController;
use obbexAdsBundleControllerDatabaseController; //new DatabaseController
class DefaultController extends Controller
{
public function indexAction()
{
$dbController = new DatabaseController();
$res = $dbController->getQuery();
}
}
和"DatabaseController"的设置如下:
namespace obbexAdsBundleController;
use SymfonyBundleFrameworkBundleControllerController;
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:错误:调用成员函数has()在/home/alfonso/sites/ads.obbex.com/public_html/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php的非对象上,行202
我的思想是吹现在,因为我正在扩展完全相同的类"控制器"。为什么它在一种情况下起作用而在另一种情况下不起作用?
显然这是一个"容器问题",可以根据另一个线程的响应或通过扩展"控制器·类"通过服务设置,但在这种情况下不起作用。
首先,您不应该将数据库管理委托给另一个控制器,这是一种不好的做法。
相反,你可以注入一个包含所有DB逻辑的服务
Symfony2在服务容器中的使用原则
或者使用EntityRepositoryhttp://symfony.com/doc/current/book/doctrine.html custom-repository-classes
关于has()
函数的问题,您正在创建一个没有任何容器的控制器实例。因此,当控制器尝试调用$this->container->has()
时抛出错误,因为容器没有定义。
我最终设置了对象调用者,我请求容器服务如下:
上的服务。yml文件
service:
manage_ads:
class: obbexAdsBundleClassesManageAds
calls:
- [setContainer, ["@service_container"]]
:
$ads_manager = $this->get('manage_ads');
$ads_manager->functionCallingTheRawQuery();
但我仍然有选择地使用它,因为现在我从实体的存储库设置查询,而不是创建我自己的对象(目前,我是symfony2的新手)