Symfony2: расширяющий FrameworkBundle Controller - PullRequest
1 голос
/ 11 октября 2011

У меня вопрос о расширении контроллера Symfony2.На данный момент я всегда расширял FrameworkBundle по одному для каждого контроллера в моем приложении.Но мне надоело всегда извлекать пользователя, делая

$this->get('security.context')->getToken()->getUser()

или

$this->getDoctrine()->getEntityManager()

каждый раз, когда мне нужен пользователь или менеджер сущностей (они мне очень нужны).Я хотел иметь возможность получить их, просто выполнив $ this-> em и $ this-> user.Поэтому я решил создать пакет с именем MyApp / RootBundle, который содержит новый контроллер, расширяющий FrameworkBundle.Этот контроллер будет расширяться каждым другим контроллером в приложении.Вот код:

<?php

namespace MyApp\RootBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\DependencyInjection\ContainerInterface;

class RootController extends Controller
{
    protected $em;

    protected $user;

    public function setContainer(ContainerInterface $container = null)
    {
        parent::setContainer($container);

        $this->onContainerSet();
    }

    public function onContainerSet()
    {
        $this->em = $this->getDoctrine()->getEntityManager();
        $this->user = $this->get('security.context')->getToken()->getUser();
    }
}

Я не смог загрузить пользователя $ this-> em и $ this-> в функцию __construct (), так как контейнер не загружался во время сборки.

Итак, мои вопросы:

  • Это хорошая идея, или я должен продолжать делать подробные вызовы?
  • Было бы лучше просто создать функции getEm ()и getUser (), который будет выполнять ту же работу?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 11 октября 2011

У меня была такая же проблема, я только что создал пользовательский контроллер с методами getUser() и getEntityManager(). Работает отлично. В этом случае я бы порекомендовал использовать методы получения вместо экземпляров классов, чтобы соответствовать тому, как Symfony2 ожидает от вас запроса служб.

Для справки, вот мой метод getUser:

public function getUser() {
        $user = $this->get('security.context')->getToken()->getUser();
        return $user;
}
0 голосов
/ 06 апреля 2015

вы можете внедрить EntityManager (или любые другие сервисы) даже без вымывания контроллера как:

use JMS\DiExtraBundle\Annotation as DI;

    class IndexController extends Controller 
    {  
       /**
         * @DI\Inject("doctrine.orm.entity_manager")
         * @var \Doctrine\ORM\EntityManager $em
         */
        protected $em;
0 голосов
/ 13 октября 2011

Я создал MyController, но также и MyRepository.Затем все контроллеры и репозитории расширяют эти классы.Я также вызываю $ this-> getRepository ("User") вместо $ this-> getDocrine () -> getEntityManager () -> getrepository ("MyappBundle: User");

0 голосов
/ 12 октября 2011

Другой вариант заключается в том, что вы определяете свои контроллеры как службы и присваиваете то, что передается вашему конструктору, любой частной переменной, которую вы хотите, но недостатком может быть то, что вам не понравятся все настройки, необходимые для этого маршрута

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...