Mike_Ro
@Mike_Ro
Python, JS, WordPress, SEO, Bots, Adversting

MVC php на пальцах?

Добрый вечер! Изучаю php на уровне написание кода для разных простых скриптов без использования фреймворков. Хочу писать красиво и понятно, мне порекомендовали изучить "идеологию" MVC, поюзал инет, но даже на пальцах тяжело воспринимается...
Хотелось-бы получить комментарий на прямом моем примере: в одном index.php прописано подключение к бд, вызов определенной таблицы из БД, форма в html для добавления данных в таблицу, функция приема данных с формы и добавления их в таблицу. Вот если сделать все красиво, то в каких файлах и почему должны содержаться различные части данного кода?
И сопутствующий вопрос: из MVC я знаю что такое Viev (я так понимаю, что это html каркас), а вот что такое модель и контролер, что они именно должно делать (на банальном примере)?
Заранее спасибо, и просьба сильно не пинать, ибо действительно тяжело получается разобраться именно в понимание "что, куда и зачем"...
  • Вопрос задан
  • 32252 просмотра
Решения вопроса 6
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Ох...

Model View Controller. Да ну его, ему уже 45 лет (придумали в 79-ом году). Давайте лучше про Model View Adapter погокорим. это то что все используют в популярных фреймворках последние лет так 10 так точно.

mvc-mvp-mvvm-6-638.jpg?cb=1375170002

Вообще в этом всем важно не только то, что каждая буква обозначает, а как они друг с дружкой связаны.

View - это не только HTML, но и вообще представление в целом, а так же логика его формирования. Шаблонизаторы, фильтры, различные функции/объекты помогаютщие нам сформировать view (например форматирование дат, сериализаторы и т.д.) В подавляющем большинстве случаев "представление" наших данных - это HTTP запросы и HTTP ответы. HTML - э то лишь часть HTTP ответа.

Model - Это целый слой, который может быть представлен в виде кучи отдельных объектиков, структур и т.д. Его задача - делать дела и хранить/менять состояние системы. Тут легко запутаться потому что термин "модель" много чего значит. Воспринимайте его как "слой логики" а не конкретные объекты. И да - база данных и прочая чушь - это детали реализации этого слоя. "не важные штуки" словом. Туда же и ActiveRecord, ORM-ки всякие. Это деталь реализации и все остальные чуваки (view и controller) о них знать ничего не должны (хотя иногда могут в целях упрощения).

Controller или адаптер. Это опять же не обязательно один объект. это может быть цепочка адаптеров (еще называют фронт-контроллером, middlewares и т.д.). Его задача весьма простая. Получаем представление данных на входе (HTTP запрос), определяем что надо делать, и просим модель что-то сделать (ни в коем случае не меняем ничего самостоятельно в контроллере, он только просит). Потом мы можем попросить модель вернуть нужный нам кусок состояния, и попросить View сформировать представление (HTTP ответ).

Как-то так. В целом же это я сейчас описал "идеальный мир". Вся суть этого подхода - разделение логики презентационной и логики приложения. Зачем это надо? что бы было проще жить! Обычно UI приложения или способы взаимодействия с ним меняются почаще логики или как минимум в разные моменты времени. Адаптеры в этом случае служат промежуточным слоем, они ничего сами не делают, это "переводчики". Они просто переводят то, что сказано в запросе в язык понятный приложению и обратно.

Но на начальной стадии можно слегка нарушать эти правила, делать толстые контроллеры и т.д. В этом случае бизнес логика будет потихоньку "вытекать" из модели. Это не хорошо, и на хоть сколько нибудь больших проектах может привести к проблемам. Потому важно находить баланс.
Ответ написан
Комментировать
@xfg
Модель - это любая ваша бизнес-логика, всякие вычисления и запросы к бд. То есть то, без чего приложение впринципе не имеет смысла.

Контроллер - это посредник между моделью и видом. Он запрашивает данные (вызывает методы) у модели и затем передает их в вид.

Вид - с помощью полученных данных от контроллера рисует пользовательский интерфейс.

Смысл в том, чтобы отделить логику приложения от представления. Представление ничего не знает о модели и наоборот.

Нужна одна точка входа. Клиент всегда запрашивает только index.php, оно там внутри на основе данных из запроса решает какой контроллер создать и какой метод из контроллера выполнить. Всё.
Ответ написан
DevMan
@DevMan
если у вас примитивная форма для добавления данных в базу, то заморачиваться с mvc никакого смысла нет -> для написания простых скриптов mvc нахер не уперся.
Ответ написан
@Silm
Просто говоря MVC - физическое разделение кода на три основные логические части: Model, View, Controller с которыми мы обязуемся работать определенным образом в целях облегчения процесса разработки.

В файлах моделей описываются данные и происходит основная их обработка. Логично, что тут мы работаем и с базой данной.

В отображениях (View) располагается так называемый "шаблон". Как правило это файлы с HTML версткой и PHP логикой отвечающей за отображения конкретных элементов. Например, тут нельзя делать запрос к БД, но можно написать цикл, который будет отображать блоки верстки с новостями.

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

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

Запрос попадает в нужный контроллер (контроллер постов). Он начинает собирать нужные данные:
  • Контроллер достает из настроек название сайта.
  • Контроллер обращается к модели отвечающей за посты, в ней содержатся различные методы, отвечающие за работу с постами (вывод списка постов, отображение одного поста, редактирование поста итп), каждый метод может делать различные запросы к БД и производить необходимые манипуляции с данными. В данном случае мы вызываем метод getPost() который получает id поста, делает выборку из БД и возвращает результат.
  • Данные из модели возвращается в контроллер. Если пост с переданным id не был найдет, именно контроллер перенаправит пользователя на страницу с кодом 404.
  • Но в нашем случае пост был найден и теперь контроллер берет из полученных данных название поста и обращается к модели ответственной за получение похожих публикаций, она на основе полученного названия возвращает массив из похожих названий статей и их id (все что нужно в нашем примере для отображения списка ссылок).
  • Контроллер собрал все что было нужно и теперь берет заданный нами файл шаблона отображения и передает туда все необходимые данные.
  • В отображении мы отображаем название сайта в тайтле, внутри верстки выводим наш пост, а по массиву похожих публикаций приходимся циклом отображая его как список ссылок.
  • Страница с постом успешно отображена.

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

Чтобы понять, что еще может делать каждая из частей и как вообще это выглядит, изучите документацию и примеры по одному из популярных PHP фреймворков, например, таких как Yii и Laravel.
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
EvolDev
@EvolDev
извините , но проще чем тут по моему не найти , и с примерами...
Ответ написан
studenter
@studenter
когда я вырасту я стану програмистым!
смысл MVC - разделение кода на независимые слои - для удобства

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

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

посмотри на MVP - мне это больше понравилось чем MVC
Ответ написан
Комментировать
@serikd
Мне вот эта статья помогла разобраться
Ответ написан
Комментировать
Комментировать
@vaajnur
битриксоид
Ответ написан
Комментировать
nefone
@nefone
Junior PHP разработчик
я по этой статье разобрался:
https://habrahabr.ru/post/150267/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы