Php Symfony 2:错误:从控制器对非对象调用成员函数has()
这是我的控制器A: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
<?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;