Движок на ООП с использованием паттерна MVC

Vital7

Новичок
Здравствуйте, пользователи. У меня вопрос, кто как пишет движки? И актульно ли использовать ООП в PHP и Model-View-Controller?
 

hell0w0rd

Продвинутый новичок
В бекенде лучше MVC на данный момент ничего нет. ООП - твое дело.
 

Вурдалак

Продвинутый новичок
Сейчас практически никто не пишет собственные «движки» (фреймворки), берут готовые решения, либо в крайнем случае почти готовые (Symfony HttpKernel).

MVC — это buzzword, особенно в мире web, когда кто-то употребляет эту аббревиатуру, то появляется больше вопросов, чем ответов. Я даже возьму на себя смелость сказать, что MVC — крайне неудачная концепция.
 

Вурдалак

Продвинутый новичок
Hexagonal Architecture.

В MVC (по крайней мере в наиболее распространенной интерпретации в web'е) самое неприятное — контроллеры. В наивных примерах там содержится логика приложения (aka «толстые контроллеры»). Потом с ростом приложения возникают проблемы реиспользования кусков приложения и люди приходят к пониманию того, что нужны так называемые «тонкие контроллеры», а вся логика должна быть в service layer, чтобы можно было использовать один и тот же кусок как с web, так и с CLI, так и с новой точки web (API или админка) и т.д. Далее люди приходят к пониманию того, что по сути тогда контроллер представляет из себя часть presentation layer (aka view layer), потому что там нет логики, это просто тонкий слой между браузером и service layer:
PHP:
class ApiController extends Controller
{
    /**
     * @return array
     *
     * @Route("/", name="create_trip")
     * @Template
     */
    public function createTripAction(Request $request)
    {
        $form = $this->createForm(new CreateTripType());
        $form->handleRequest($request);

        if ($form->isValid()) {
            $trip = $this->get('command_handler')->execute($form->getData());

            return new Response('ok');
        }

        return array(
            'form' => $form->createView(),
        );
    }
}
— форма, HTTP-request, etc. Это чисто presentation layer, а эту логику с валидацией можно безболезненно перенести на JavaScript. Ничего не изменится: просто в случае если пользователь отключит JS, то из-за exception'а из domain layer приложение будет падать с ошибкой.

Ещё раз: получается, что controller из MVC — это часть presentation layer, view. Контроллер — часть view? И тут появляется понимание того, что с MVC что-то не так: либо это неверная концепция, либо она настолько всеми не понята, то увы, теперь эту аббревиатуру в разговоре употреблять неудобно: появляется риск, что собеседник понимает под MVC что-то своё.
 
Последнее редактирование:

hell0w0rd

Продвинутый новичок
Вурдалак, мне кажется, или это относится к несколько другому уровню, чем mvc? То есть это вполне себе может существовать совместно с mvc?
 

Вурдалак

Продвинутый новичок
hell0w0rd, ответил более развёрнуто.

Ну, расскажи, что ты понимаешь под MVC.

Т.е. я не против употребления понятия «контроллер», понимая под этим штуку, которая принимает на вход HttpRequest, а возвращает HttpResponse (явно или неявно). Но термина MVC я уже давно стараюсь избегать.
 
Последнее редактирование:

hell0w0rd

Продвинутый новичок
Вурдалак, контроллер - то что связывает model и view. То есть естественно принимает запрос и возвращает ответ (ну и так-то это может быть не обязательно HTTP, cli-приложения вполне также реализуются). В model фактически вся логика, в view - только то, как показать ответ. Это может быть сериализация, или ренринг html, или что-то еще.
 

Вурдалак

Продвинутый новичок
Вурдалак, контроллер - то что связывает model и view.
Звучит многообещающе.

То есть естественно принимает запрос и возвращает ответ (ну и так-то это может быть не обязательно HTTP, cli-приложения вполне также реализуются).
Принимать запрос и возвращать ответ — это частный случай web'а. В CLI приложение может быть интерактивным, что уж говорить про оконные приложения.
 

AmdY

Пью пиво
Команда форума
Vital7, берешь composer, лезешь за пакетами на packagist подключаешь мидлеваре stack и вперед. Пака не освоишь эти три краеугольные камня, разговаривать о фреймворках бессмысленно.
 

fixxxer

К.О.
Партнер клуба
hell0w0rd, ты angularjs же хорошо вроде знаешь? Вот рассмотреть mvc на его примере намного "честнее", чем на примере "рожденного умирать" php - особенно учитывая, что термин mvc был впервые применен, если я не ошибаюсь, применительно к smalltalk. И не слишком ли разные вещи тогда понимаются под словом "связывать"?
 

Vital7

Новичок
Сейчас практически никто не пишет собственные «движки» (фреймворки), берут готовые решения, либо в крайнем случае почти готовые (Symfony HttpKernel).
Готовые решения, ты не про WordPress, Joomla?
Vital7, берешь composer, лезешь за пакетами на packagist подключаешь мидлеваре stack и вперед. Пака не освоишь эти три краеугольные камня, разговаривать о фреймворках бессмысленно.
Хорошо, я посмотрю.
 

fixxxer

К.О.
Партнер клуба
Готовые решения - это в данном контексте фреймворки. Symfony2, Laravel итд
 

Фанат

oncle terrible
Команда форума
Только надо понимать, что готовые решения - это MVC "по-пхпешному". То есть контроллер - это логика роутера, то, что называется контроллером - это модель, а то что называется моделью - это всего лишь ORM.
 

fixxxer

К.О.
Партнер клуба
Только надо понимать, что готовые решения - это MVC "по-пхпешному". То есть контроллер - это логика роутера, то, что называется контроллером - это модель, а то что называется моделью - это всего лишь ORM.
Это если говнокодить как в примерах к yii. :)
Те же репозитории и сервисы прекрасно делаются и в ActiveRecord-based фреймворках.
 

Фанат

oncle terrible
Команда форума
Это если говнокодить как в примерах к yii. :)
Те же репозитории и сервисы прекрасно делаются и в ActiveRecord-based фреймворках.
Те же репозитории и сервисы прекрасно делаются и плентекстом.
Но речь о фреймворках, которые не просто набор инструментов, но и идеология, предлагаемая пользователю структура приложения.
И вот эта предлагаемая структура приложения как раз и представляет собой тонкий контроллер в роутере, модель в контроллере и тупой маппер для БД таблиц в моделе.
Делать по-другому - это идти против гайдлайнов фреймваорка, и не только йи.
Класс Юзер екстендс Модел - это просто маппер, и ничего кроме маппера, ничего общего с толстой моделью не имеющий. Если утка ходит как маппер, крякает как маппер, имеет кучу унаследованных методов для работы маппером, то это что угодно, но не модель из теорий.
Может быть, в каки-то воображаемых проектах и сделано, как ты говоришь, но фактически система такова, как я ее описал
 

hell0w0rd

Продвинутый новичок
fixxxer, ну почему же. Мы всю логику view выносим в шаблоны/директивы, всю работу с моделью в сервисы. Итого у контроллера остается точка входа (обработка routeParams) и реакция на запросы от пользователя (обработка событий). Вполне вроде укладывается в то, что я написал.
 
Сверху