Что делает фреймворк "истинным" фреймворком MVC?


Читая онлайн-дискуссии о фреймворках MVC, я слышу много комментариев, направленных на PHP-проекты, такие как Cake, Code Igniter и Symfony, от разработчиков Java/.NET в духе "это умные хаки, но не настоящие MVC".

Итак, что делает что-то "истинным" фреймворком MVC; т.Е. Каков пример платформы .NET или Java MVC, которая работает иначе, чем Cake, Code Igniter, Symfony и т. Д., И что это за разные вещи? Это просто отсутствие PHP принудительная ориентация объекта, требующая начальной загрузки, или это что-то другое?

Я знаю, почему PHP язык "отстой", меня больше интересуют различия в реализации и/или использовании MVC.

Author: Alan Storm, 2009-06-18

8 answers

Идея MVC состоит в том, чтобы разделить архитектуру приложения на три независимых уровня и позволить каждому из этих уровней использовать другую реализацию, не затрагивая другие уровни. В основном различие заключается в бизнес-логике (Модели) и представлении (Представлении).

Многие фреймворки PHP пытаются использовать философию Ruby on Rails "самоуверенного программного обеспечения", поэтому для правильного функционирования Модели и представления вместе требуется, чтобы оба соответствовали определенному реализация. То есть классы должны быть названы определенным образом, файлы в проекте должны быть организованы в соответствии с определенной структурой каталогов, обозначения в сценариях представления должны соответствовать соглашению и т.д.

Это затрудняет независимую замену различных реализаций каждого уровня, и это противоречит цели MVC по отделению уровней друг от друга.

 13
Author: Bill Karwin, 2009-06-18 18:40:24

Вы можете найти эту вики-страницу полезной.

 2
Author: Paul Sonier, 2009-06-18 18:28:26

Истинная структура MVC не имеет слоя M(odel). У CakePHP и друзей есть несколько умных классов для доступа к базе данных, которую они называют Моделью, оставляя основную часть обработки данных контроллеру.

Это неправильно. Модель должна выполнять всю обработку данных (и она может использовать для этого вспомогательные классы баз данных), а контроллер должен быть шлюзом между пользователем/веб-страницей и моделью. В большинстве случаев модель представляет собой простой PHP-объект, не подчиняющийся никаким правилам, поэтому фреймворк не может указывать эти правила.

 2
Author: Bart van Heukelom, 2009-11-26 15:51:58

Вот несколько вопросов, которые могут помочь вам понять, хороша ли ваша структура и верна ли она.

"Могу ли я запускать модульные тесты для своих классов MVC без фреймворка?"

И это применимо, даже если вы не пишете модульный тест.

Вы должны иметь возможность писать код, связанный с MVC, независимо от платформы. Когда ваше приложение получает некоторые входные данные из фреймворка, это должно быть в виде объектов с известными интерфейсами, без конкретных классов.

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

"Работает ли он на волшебной и волшебной пыли?"

Вы должны иметь возможность расширять любой класс, который был предоставлен фреймворком. И должно быть легко понять, какие функция, которую вы должны реализовать.

Это становится очень трудно сделать, если "что-то просто произойдет". Обычно это указывает на глобальное состояние в коде фреймворка. Либо в виде статических методов, либо глобальных/статических переменных.

"В какой момент срабатывает МОЙ код?"

Можете ли вы найти, где и как выполняется ваш контроллер? Обычно это будет не так просто. Эта мистическая точка обычно находится глубоко в объектном графике. Иногда даже в расширенном классе.

Такая ситуация делает вам очень сложно изменить среду, в которой был выполнен контроллер. Это также налагает строгие правила того, как должны выглядеть ваши методы контроллера.

Все это возвращает нас к тому, что в рамках true MVC следует улучшать процесс разработки, а не ограничивать ваши возможности.

"Предполагалось, что он/она сможет это сделать?"

Аутентификация авторизация может показаться отдельным аспектом разработки, но на самом деле в контексте MVC, это имеет тенденцию быть несколько сложным.

Многие фреймворки имеют некоторую инфраструктуру аутентификации/авторизации. Это повторяющаяся задача, и мы все сделали это до смерти, таким образом - это хороший кандидат на функцию, которую может предоставить фреймворк.

Но вот в чем загвоздка: большинство из них пытаются поместить авторизацию в ваши контроллеры, и они очень придирчивы к тому, как ее можно настроить. Это еще одно ограничение.

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

..мои два цента

 2
Author: tereško, 2012-06-14 15:22:10

Cake и большинство фреймворков "MVC" - это то, что вы могли бы назвать "Пассивным представлением" MVC. Вот отличная статья, объясняющая: http://www.martinfowler.com/eaaDev/PassiveScreen.html

 1
Author: Nolte, 2009-06-19 13:56:53

Иногда людям нужно отступить и взглянуть на "рамки" реальной жизни, из которых цифровой мир получил этот термин. Это может помочь объяснить его значение, несмотря на бесконечные онлайн-варианты, искажающие слово, чтобы соответствовать личным целям и принижать другие системы.

Структура должна помочь вам во всех областях вашей работы.

Итак, если у вас есть только одна страница портфолио - тогда вам нужен только крошечный набор инструментов. Если вы запустите следующий Facebook, то ваша "структура" будет совершенно другой.

 0
Author: Xeoncross, 2009-06-18 22:14:01

Фреймворк, как следует из его названия, предназначен для поддержки структур - в данном случае вашего приложения. Общая (и печальная) особенность большинства фреймворков, которые вы видите, заключается в том, что они сами становятся навязывающими структурами, диктующими свой собственный способ разделения бизнес-логики, представления, маршрутизации/управления. Вы увидите код приложения, который выглядит так, будто вам нужна целая команда только для того, чтобы поддерживать то, что вы написали год назад. Похоже, что цель заключается в богатстве возможностей в рамки. Нет, это не так. Речь идет о предоставлении программисту свободы самостоятельно решать, какие компоненты приложения должны быть разделены и где должно быть разделение - до тех пор, пока задача может быть распределена между рабочей группой людей с их собственным опытом.

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

 0
Author: stillstanding, 2010-02-19 19:26:00

JavaServer Faces - довольно хорошая платформа полного стека для MVC. Он имеет хорошие компоненты представления, хорошие контроллеры с управляемыми компонентами, и для модели вы можете создавать бизнес-классы.

 -3
Author: amischiefr, 2009-06-18 18:24:30