Mike_Ro
@Mike_Ro
Войти в АйТи...

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

Добрый вечер! Изучаю php на уровне написание кода для разных простых скриптов без использования фреймворков. Хочу писать красиво и понятно, мне порекомендовали изучить "идеологию" MVC, поюзал инет, но даже на пальцах тяжело воспринимается...
Хотелось-бы получить комментарий на прямом моем примере: в одном index.php прописано подключение к бд, вызов определенной таблицы из БД, форма в html для добавления данных в таблицу, функция приема данных с формы и добавления их в таблицу. Вот если сделать все красиво, то в каких файлах и почему должны содержаться различные части данного кода?
И сопутствующий вопрос: из MVC я знаю что такое Viev (я так понимаю, что это html каркас), а вот что такое модель и контролер, что они именно должно делать (на банальном примере)?
Заранее спасибо, и просьба сильно не пинать, ибо действительно тяжело получается разобраться именно в понимание "что, куда и зачем"...
  • Вопрос задан
  • 25369 просмотров
Решения вопроса 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 Куратор тега PHP
если у вас примитивная форма для добавления данных в базу, то заморачиваться с mvc никакого смысла нет -> для написания простых скриптов mvc нахер не уперся.
Ответ написан
@Silm
Просто говоря MVC - физическое разделение кода на три основные логические части: Model, View, Controller с которыми мы обязуемся работать определенным образом в целях облегчения процесса разработки.

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

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

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

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

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

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

Чтобы понять, что еще может делать каждая из частей и как вообще это выглядит, изучите документацию и примеры по одному из популярных PHP фреймворков, например, таких как Yii и Laravel.
Ответ написан
Пригласить эксперта
Ответы на вопрос 7
EvolDev
@EvolDev
извините , но проще чем тут по моему не найти , и с примерами...
Ответ написан
vlad6085
@vlad6085
в одном index.php грубо говоря подключаются настройки, DI, и инициализируется какой нибудь класс Application, который инкапсулирует все этапы выполнения приложения (например: запустить роутер, от роутера узнать какой контроллер выполнить, передать диспетчеру выполнение метода контроллера).

Разъяснять заново что такое контроллер и модель - ну уж нет, даже на тостере уже сотни раз разъяснено и разжевано, не говоря о большом количестве статей, книжек и руководств.

"html каркас" - это шаблон - template (не факт что он вообще будет похож на html - он может быть на том же jade к примеру), view - весь слой mvc, отвечающий за отображение (то что превратит шаблон с переменными в html разметку страницы)
Ответ написан
studenter
@studenter
когда я вырасту я стану програмистым!
смысл MVC - разделение кода на независимые слои - для удобства

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

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

посмотри на MVP - мне это больше понравилось чем MVC
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
SaveTime Москва
от 100 000 руб.
Teamlead Ставрополь
от 25 000 до 50 000 руб.
от 60 000 до 80 000 руб.
19 нояб. 2019, в 18:13
2500 руб./за проект
19 нояб. 2019, в 17:59
300 руб./за проект
19 нояб. 2019, в 17:42
300 руб./за проект