Symfony2 и MVC - Является ли расширенный контроллер хорошей практикой?

У меня простой и возможно глупый вопрос.

Используя PHP-фреймворк Symfony2, я часто работаю над расширением контроллеров, как показано ниже (конечно, это зависит от вида работы):

    class MainController extends Controller{
        private $locale = array();

        protected function Locale() {
        $em = $this->getDoctrine()
            ->getManager();

                $this->locale = $em->getRepository('CommonLanguageBundle:Language')
            ->findBy(
                array('code' => $this->getRequest()
                    ->getLocale()
                )
            );
//      \Doctrine\Common\Util\Debug::dump($this->locale);
        return $this->locale[0];
    }
     //..
    }
    class StoreController extends MainController{
     function a_method() {
       $data = $this->Locale()->getId();
       //...
      }
    }
    class DefaultController extends StoreController {
     $data = $this->Locale()->getId();
     //...
    }

Это хорошая практика?

Прошерстив Интернет, я нашел много статей, но для меня это не так ясно.

В конце концов, если бы это работало нормально в Symfony2, было бы это вообще хорошо для паттерна MVC?


person Roberto Rizzi    schedule 11.02.2014    source источник
comment
Ваш вопрос слишком широк, я предлагаю вам сосредоточиться на Symfony2, даже если этого недостаточно, чтобы избежать закрытия вопроса.   -  person A.L    schedule 11.02.2014
comment
Мне тоже нравится это делать, это важно для повторного использования кода. Также я видел статьи о расширении маршрутов пакетов, которые требуют его использования.   -  person Mihai Stancu    schedule 11.02.2014
comment
С какой целью вы расширяете класс? Это не имеет ничего общего с MVC, но с ООП. Если в расширении класса нет никакой пользы, вам не следует этого делать. Если есть, то делай.   -  person deceze♦    schedule 11.02.2014
comment
@ n.1 Я не думаю, что вопрос слишком широк. Хороший ответ может указать тот факт, что Symfony2 позволяет это, а X framework - нет, но в целом большинство из них разрешают это.   -  person Mihai Stancu    schedule 11.02.2014
comment
Попробуйте обновить свой вопрос и опубликовать исходный код для вашего MainController. Это даст нам некоторое представление о том, имеет ли смысл расширяться от него или общая функциональность должна быть в каком-то другом классе.   -  person Cerad    schedule 11.02.2014
comment
Большое спасибо за ответы. Соглашусь с вами насчет реальной пользы и полезности, на самом деле я написал, что это зависит от рода работы. Конечно, я не стал расширять контроллер, поскольку это бесполезно. Мой вопрос относится к тем случаям, когда есть общие методы, общий вызов репозитория и т.д..   -  person Roberto Rizzi    schedule 11.02.2014
comment
Как предложил Cerad, я обновил пост, указав пример общего контроллера. Это не имеет смысла, но это просто дать представление   -  person Roberto Rizzi    schedule 11.02.2014
comment
В вашем примере я бы использовал прослушиватель событий запроса, чтобы добавить локаль непосредственно в объект запроса, чтобы все мои контроллеры имели к нему доступ без необходимости расширения. Я мог бы опубликовать пример, если хотите.   -  person Cerad    schedule 11.02.2014
comment
было бы очень полезно опубликовать экземпляр :) Большое спасибо   -  person Roberto Rizzi    schedule 12.02.2014


Ответы (1)


Symfony не является средой MVC. Symfony — это сервисно-ориентированная архитектура. Обычно каскадные расширяющие контроллеры не имеют смысла.

Вместо этого вам следует создать сервисы и использовать их по мере необходимости.

Кроме того, хорошей практикой является определить контроллер как службу.

person NHG    schedule 11.02.2014
comment
Немногие примеры библиотек MVC могут определенно соответствовать конкретному определению того, что такое MVC. Symfony2 поддерживает MVC, если вы так склонны его использовать и структурировать. - person Mihai Stancu; 11.02.2014
comment
Magento MVC — действительно странный пример этого. - person Mihai Stancu; 11.02.2014
comment
Согласовано. В ответ на OP лучший способ может выглядеть так: Уход от базового контроллера — Ричард Миллер - person Padrig; 11.02.2014
comment
Короче говоря, поместите общие методы в сервисный класс, а не в базовый класс. - person Padrig; 11.02.2014
comment
Большое спасибо NHG за ваш пост. Это очень полезно и очень помогает мне понять структуру Symfony2. - person Roberto Rizzi; 12.02.2014