Могу ли я применить шаблон проектирования MVC к процедурной PHP

Я пытался выяснить, могу ли я применить архитектуру MVC к процедурной и как я могу реализовать ее в своем коде. По моему мнению, MVC в основном представляет собой разделение бизнес-логики, презентационного уровня и другой логики, хотя, как представляется, он всегда нацелен на OO-PHP в частности.

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

Спасибо.

Ответы

Ответ 1

MVC - это шаблон OO, и вы хотите подходить к нему с процедурным контекстом.

Это неправильно. MVC не имеет ничего общего с объектно-ориентированным кодированием.

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

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

Что касается вопроса: самый простой способ получить шаблон MVC при кодировании процедурного PHP - использовать множество небольших функций, где каждая конкретная функция имеет свою уникальную задачу. Не позволяйте функции выполнять много задач. Таким образом, легче отделять вещи. Также не храните много функций в одном файле. Скорее собирайте связанные функции вместе в меньших группах каждой группы в своем собственном файле (что на самом деле сделано в OO с классами).

Кто-то делает это здесь с простым примером: MVC без OO: http://www.fluffycat.com/PHP-Design-Patterns/Non-OO-MVC/

Ответ 2

Да, это о суммировании MVC... но это не обязательно должно быть объектно-ориентированным... вам просто нужно следовать нескольким золотым правилам:

  • Контроллер получает и обрабатывает ввод, генерирует любые данные и помещает их в модель.
  • Вид принимает данные из модели и отображает ее.
  • Контроллер не должен форматировать данные для просмотра - он не должен знать, как/почему/что хочет просмотр (например, не вставляет HTML в текстовую строку, поскольку вывод может быть JSON)
  • В представлении не нужно искать какие-либо данные для себя - если это не в модели, тогда контроллер не выполнил эту работу (выбросить/сообщить об ошибке).

Помимо этого вы можете делать все, что захотите. Вам в принципе понадобится набор процедур для управления контроллерами - разбор $_REQUEST vars (более вероятно, как GET/POST/COOKIE), выполняющий любое построение поиска данных + заполнение модели, а затем другой набор процедур, которые при просмотре - взяв то, что в модели, и отрисует ее для пользователя. Модель может быть простой, как ассоциативный массив.

Ответ 3

Это странно. MVC - это шаблон OO, и вы хотите подходить к нему с процедурным контекстом.

Первое, что приходит мне на ум, - это иметь какой-то шаблонный движок, чтобы разделить PHP на код HTML. Это будет один большой шаг к процедурной MVC:)

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

Например, посмотрите PHP процедурные функции для работы с mysql:

mysql_connect()
mysql_real_escape_string();
mysql_select_db();
mysql_query();

и т.д.. И группируйте эти функции в отдельные файлы. Это также поможет отделить немного от логики.

Если что-нибудь еще придет мне на ум, я отредактирую свой пост:)

Ответ 4

Если вы внедряете новый шаблон дизайна, вы, скорее всего, реорганизуете или пишете что-то с нуля. Я настоятельно рекомендую перейти на ООП, если вы планируете использовать MVC. Это может быть реализовано процедурно, но будет очень хакерским и не лучшим решением.

Есть несколько бесплатных MVP-решений, которые вы можете легко найти. Вот несколько:

  • Zend Framework
  • Kohana
  • Идентификатор кода

Ответ 5

Совершенно верно. Используйте любую комбинацию из следующих функций:

  • Использовать файлы include.
  • Использовать функции.
  • Отделите исходные файлы.
  • Разделите разделы кода в исходных файлах.
  • Используйте блоки кода (фигурные скобки).
  • Отдельные файлы PHP и/или HTML и/или JS.

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