Symfony 2 FatalErrorException:错误:在非对象上调用成员函数has()

时间:2014-05-19 19:57:15

标签: database symfony controller call

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行

我现在正在思考,因为我正在扩展完全相同的类“控制器”。为什么它在一个案例中而不在另一个案例中工作?

显然,这是一个“容器问题”,可以根据另一个线程中的响应设置服务,或者通过扩展“控制器类”但在这种情况下不起作用。

2 个答案:

答案 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的新手)