Symfony 2: Ошибка: вызов функции-члена has () для необъекта из контроллера

1

Здесь мой контроллер 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));
    }
}
?>

И thats Контроллер 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, я получаю сообщение об ошибке:

Ошибка: вызов функции-члена имеет() для не-объекта. Внутренняя ошибка сервера. - FatalErrorException.

Трассировка стека: в поставщике /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/?

Теги:
doctrine
controller

2 ответа

0
Лучший ответ

В дополнение к ответу @Christian Bujoreau вы можете использовать метод forward: 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;

}

1

Решение состоит в том, чтобы объявить ваш контроллер 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!');
        }
    }
}
  • 0
    Спасибо, я собираюсь попробовать это. Просто для понимания: почему это не работает так, как я это сделал? @CristianBujoreanu
  • 0
    Проверьте это для более подробной информации по этой теме: symfony.com/doc/master/cookbook/controller/service.html

Ещё вопросы

Сообщество Overcoder
Наверх
Меню