Symfony 2 fatalerroreexception: Error:在非对象上调用成员函数has()



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在服务容器中的使用原则

或者使用EntityRepository

http://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的新手)

最新更新