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

B R*_*Rad 7 php doctrine symfony

我已经阅读了很多这方面的主题,我似乎无法找到解决问题的方法.

我觉得问题很明显,也许我刚刚盯着它看了太长时间.

错误是FatalErrorException:错误:调用成员函数has()在/vagrant/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php第198行中的非对象

它说,看错误线.

public function getDoctrine()
    {
        if (!$this->container->has('doctrine')) {
            throw new \LogicException('The DoctrineBundle is not registered in your application.');
        }

        return $this->container->get('doctrine');
    }
Run Code Online (Sandbox Code Playgroud)

这是我的代码......

这是调用DAO控制器的主控制器

public function clickThroughAction(request $request, $hash)
    {
        if (isset($hash)) {
            $dbController = $this->get('database_controller');
            print_r($dbController->getReferralIdByHash($hash));
            return $this->redirect($this->generateUrl('home'));
        } else {
            return 0;

        }
    }
Run Code Online (Sandbox Code Playgroud)

这是正在使用的服务.

services:
    database_controller:
        class:  Fuel\FormBundle\Controller\DatabaseController
Run Code Online (Sandbox Code Playgroud)

这是调用数据库的dao控制器.

public function getReferralIdByHash($hash)
    {
        $em = $this->getDoctrine()->getManager();
        $query = $em->createQuery(
            'Select u From FuelFormBundle:UserReferrals u WHERE u.user_hash = :hash'
        )->setParameter('hash', $hash);

        $referral = $query->getResult();

        if (!$referral) {
            throw $this->createNotFoundException(
                'No product referral found'
            );
            $logger = $this->get('logger');
            $logger->info('I just got the logger');
            $logger->crit('An error occurred, hash for referrals is not recognized. current hash is: ' . $hash . " .");
            return $this->redirect($this->generateUrl('home'));
        }

        $clickThroughCount = $referral[0]->getClickThrough();
        $referral[0]->setClickThrough($clickThroughCount + 1);
        $em->flush();
        return $referral;
    }
Run Code Online (Sandbox Code Playgroud)

我认为问题是学说容器不存在,这就是我遇到问题的原因.我不知道如何解决这个问题.

任何帮助表示赞赏.谢谢!

编辑


好的,这就是我改变了.

主控制器保持不变.

DAO控制器添加了一些东西.

class DatabaseController extends Controller{
    protected  $entityManager;

    public function __construct($entityManager) {
        $this->entityManager = $entityManager;
    }
public function getReferralIdByHash($hash)
    {
        $em = $this->entityManager;
        $query = $em->createQuery(
            'Select u From FuelFormBundle:UserReferrals u WHERE u.user_hash = :hash'
        )->setParameter('hash', $hash);

        $referral = $query->getResult();

        if (!$referral) {
            throw $this->createNotFoundException(
                'No product referral found'
            );
            $logger = $this->get('logger');
            $logger->info('I just got the logger');
            $logger->crit('An error occurred, hash for referrals is not recognized. current hash is: ' . $hash . " .");
            return $this->redirect($this->generateUrl('home'));
        }

        $clickThroughCount = $referral[0]->getClickThrough();
        $referral[0]->setClickThrough($clickThroughCount + 1);
        $em->flush();
        return $referral;
    }
}
Run Code Online (Sandbox Code Playgroud)

服务最终看起来像这样

services:
     database_controller:
          class:  Fuel\FormBundle\Controller\DatabaseController
          arguments: ["@doctrine.orm.entity_manager"]
Run Code Online (Sandbox Code Playgroud)

Nic*_*ich 23

问题是容器没有注入控制器.

通常情况下,如果您正在扩展,Symfony会自动执行此操作Symfony\Bundle\FrameworkBundle\Controller\Controller,这本身就会扩展Symfony\Component\DependencyInjection\ContainerAware:

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class YourController extends Controller
Run Code Online (Sandbox Code Playgroud)

使用setter注入setContainer()将容器作为参数调用方法,将容器注入控制器(如果没有明确定义为服务).

现在,当您将控制器配置为服务时,需要将setContainer调用添加到服务配置中:

services:
    database_controller:
        class:  Fuel\FormBundle\Controller\DatabaseController
        calls:
            - [setContainer, ["@service_container"]]
Run Code Online (Sandbox Code Playgroud)

之后清除缓存.