【问题标题】:Symfony 2: Error: Call to a member function has() on a non-object from ControllerSymfony 2:错误:从控制器调用非对象上的成员函数 has()
【发布时间】:2015-08-26 09:36:37
【问题描述】:

这是我的控制器 A:

<?php

namespace MonitoringBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;

use Doctrine\ORM\Query\ResultSetMapping;

use MonitoringBundle\Entity\MarketplaceShop;

use MonitoringBundle\Controller\BController;

class AController extends Controller
{
    /**
     * @Route("/A")
     * @Template()
     */
    public function AAction()
    {
        $B = new BController;

        $response = $B->BAction();

        return $this->render('MonitoringBundle:Default:index.html.twig', array('BVar' => $response));
    }
}
?>

那是控制器 B:

<?php

namespace MonitoringBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;

use Doctrine\ORM\Query\ResultSetMapping;

use MonitoringBundle\Entity\MarketplaceShop;

class BController extends Controller
{
    /**
     * @Route("/B")
     * @Template()
     */
    public function BAction()
    {

        $id     = 'A2WPX7PK44TEBQ';
        $em     = $this->getDoctrine()->getManager();
        $shop   = $em->getRepository('MonitoringBundle:MarketplaceShop')
                     ->findOneByUniqueShopId($id);
        if (!$shop) {
            // do something
            return new Response('Shop does not exist.');
        } else {
            // do something else
            return new Response('Shop exists!');
        }
    }

}
?>

当我拨打http://example.com/B 时,一切都很好,我得到了回复:

商店不存在。

但是当我调用http://example.com/A 时,我得到一个错误:

错误:在非对象上调用成员函数 has() 500 内部服务器错误 - FatalErrorException

堆栈跟踪: 在 vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php 第 291 行

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

为什么它适用于 /B/ 而不适用于 /A/?

【问题讨论】:

    标签: php symfony controller doctrine


    【解决方案1】:

    一种解决方法是将你的B控制器声明为服务,并在A控制器中通过$this->container->get('controllerB');调用它

    在 services.yml 中:

    controllerB:
        class: MonitoringBundle\Controller\BController
        arguments:
            entity_manager: "@doctrine.orm.entity_manager"
    
    
    class AController extends Controller
    {
        /**
         * @Route("/A")
         * @Template()
         */
        public function AAction()
        {
            $B = $this->container->get('BController');
    
            $response = $B->BAction();
    
            return $this->render('MonitoringBundle:Default:index.html.twig', array('BVar' => $response));
        }
    }
    
    
    class BController extends Controller {
        /**
         * @var EntityManager
         */
        protected $entityManager;
    
        /**
         * Constructor
         * @param $entityManager
         */
        public function __construct($entityManager)
        {
            $this->entityManager = $entityManager;
        }
    
        /**
         * @Route("/B")
         * @Template()
         */
        public function BAction()
        {
    
            $id     = 'A2WPX7PK44TEBQ';
            $shop   = $this->entityManager->getRepository('MonitoringBundle:MarketplaceShop')
                         ->findOneByUniqueShopId($id);
            if (!$shop) {
                // do something
                return new Response('Shop does not exist.');
            } else {
                // do something else
                return new Response('Shop exists!');
            }
        }
    }
    

    【讨论】:

    【解决方案2】:

    除了@Christian Bujoreau 的回答,你还可以使用转发方法:http://symfony.com/doc/current/book/controller.html#forwarding-to-another-controller

    public function AAction()
    {
        $response = $this->forward('MonitoringBundle:BController:BAction', array(
            // 'some_variable'  => $some_variable,
        ));
    
    ...
    
    return $response;
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多