Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony 2:错误:从控制器对非对象调用成员函数has()_Php_Symfony_Controller_Doctrine - Fatal编程技术网

Php Symfony 2:错误:从控制器对非对象调用成员函数has()

Php Symfony 2:错误:从控制器对非对象调用成员函数has(),php,symfony,controller,doctrine,Php,Symfony,Controller,Doctrine,这是我的控制器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\Framewo

这是我的控制器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/一起工作,而不与/A/?

解决方案是将您的B控制器声明为服务,并通过$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!');
        }
    }
}

除了@Christian Bujoreau答案外,您还可以使用正向方法:


}

谢谢,我要试试这个。只是为了理解:为什么它不能像我那样工作@CristianBujoreanuCheck查看此主题的更多详细信息:
public function getDoctrine()
{
if (!$this->container->has('doctrine')) {
throw new \LogicException('The DoctrineBundle is not registered in your application.');
}
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!');
        }
    }
}
public function AAction()
{
    $response = $this->forward('MonitoringBundle:BController:BAction', array(
        // 'some_variable'  => $some_variable,
    ));

...

return $response;