Поділ коду і шаблону, MVC - Частина II

Що ж таке MVC
Що ж таке MVC? У перекладі з англійської, це означає «Модель-Представлення-Контролер». Насамперед, для наочності, я приведу ілюстрацію концепції MVC і ілюстрацію ієрархії файлів при використанні цієї технології:

концепція MVC концепція MVC   Ієрархія файлів при використанні MVC Ієрархія файлів при використанні MVC

Для простоти, в подальшому файли будемо називати так:

  • index.php - Контролер;
  • model.php - Модель;
  • shablon.html - Подання.

В папці / tpl зберігаються всі шаблони (дизайни) нашої сторінки. В папці / img - всі використовувані зображення.

Загалом і найпростішому випадку дана архітектура складається з трьох файлів, кожен з яких і відповідає за конкретну букву в абревіатурі MVC. Головний файл - файл, розташований в корені - index.php. Цей файл буде автоматично запускатися, якщо користувач зайде в кореневу директорію. Файл index.php - це контролер, який відповідає за обробку дій користувача, наприклад, натискання кнопок у формах, виклик різних функцій і підключення шаблону. Зазвичай, цей файл має невеликий розмір і містить лише виклики функцій. Всі призначені для користувача функції виносяться в файл model.php. Цей файл являє собою набір цих функцій - бібліотеку. Нічого крім них там не міститься.

Щоб використовувати функції з model.php в початок коду файлу index.php вставляється рядок, що підключає цю бібліотеку:

Після цього скрипту стануть доступні всі функції, написані Вами. Погодьтеся, куди зручніше зберігати всі функції в окремому файлі, який в потрібний момент просто підключається до основної програми. Правити таку програму стає дуже просто. Скажімо, з розширенням функціональності Вашого сайту, ви просто в кінець файлу model.php додаєте нову функцію і з цього моменту вона буде доступна в основній програмі.

Файл же index.php обробляє передані POST і GET запитами параметри, введені в форми користувачем дані і в залежності від умов запускає різні функції з моделі, які, в свою чергу, генерують дані для Уявлення. Варто зауважити, що ні index.php, ні model.php не виводять жодного рядка коду, т. Е. Усередині цих файлів не зустрічаються echo і print. Чому так? В цьому ж і є принцип поділу коду та дизайну. Адже якщо, скажімо, в Моделі буде функція, яка буде виводити будь-якої текст і колись дизайнеру знадобиться її «задізайніть», додавши, наприклад,

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

Ось і виходить, що Контролер в залежності від різних обставин (параметри, натискання різних кнопок на сторінках, статус користувача і т. Д.) Викликає різні, потрібні для даних обставин функції з бібліотеки функцій - Модуля, який формує дані для Віда. А Вид, який є за своєю суттю простим html-документом зі вставками php-змінних в потрібних місцях, отримавши всі дані від Моделі, формує зовнішній вигляд сторінки, в кінцевому рахунку, одержуваної користувачем.

У чому суть такого поділу? По-перше, всі шаблони верстальник пише сам, не замислюючись над тим, як і що реалізує програміст. Їм лише потрібно узгодити всі змінні і масиви, які верстальник повинен буде вставити в html-код сторінки. На цьому поглиблення в нетрі php-кодинга для верстальника закінчується;) По-друге, всі функції винесені в окремий файл, що дозволяє завжди легко і зручно їх правити / додати / видалити. По-третє, логіка всього програми знаходиться у файлі index.php (Контролер). Логіка, її ще часто називають Бізнес-логікою, є «серцем» скрипта. Саме вона вирішує, що саме Ваш код повинен зробити. Дуже зручно, коли логіка не захаращена елементами дизайну і функціями. Ну і до четвертого плюса даної технології можна віднести можливість Контролера в залежності від будь-яких обставин завантажити інший шаблон, помінявши при цьому дизайн сторінки.

Спробую тепер пояснити суть MVC на прикладі. Уявіть, що у нас є сторінка, на якій знаходиться якась новина і, наприклад, п'ять коментарів користувачів. Нехай адресу цієї сторінки буде true-coder. ru /. Тобто, сам файл має ім'я index.php. Це наш Контролер. На сторінку можна зайти з правами гостя, звичайного користувача і адміністратора. Якщо на сторінку зайде адміністратор, праворуч від тематичної частини буде розташовуватися якась статистика, а під кожним коментарем користувачів - посилання на видалення. Ні першого, ні другого в браузері звичайного користувача видно не буде. А в браузері гостя не буде навіть коментарів. Тому, наш дизайнер малює три варіанти цієї сторінки з різним функціоналом, верстальник створює три html-файлу, відповідно. У підсумку, ми отримуємо файли, які назвемо, наприклад shablon1.html, shablon2.html і shablon3.html, які, як на картинці вище, помістимо в папку / tpl. Тепер займемося Моделлю. Функцій там може бути багато, але ми опишемо лише ті, які важливі для даного прикладу. Скажімо, нам потрібно написати функцію для отримання з бази даних тексту новини (новина буде залежати від параметра id, переданого в GET-запиті: true-coder. Ru /? Id = 3), функцію для виведення коментарів, функцію для видалення коментаря, а також функцію для виведення статистики для адміністратора.

Назвемо їх наступним чином:

  • Show_News () - функція для виведення новини;
  • Comments () - функція для виведення коментарів;
  • Delete_Comment () - функція для видалення коментаря;
  • Stat () - функція для виведення статистики.

Нагадаю, що в тілі функції не повинно бути жодного висновку інформації, функція повинна просто повертати змінну або масив назад в контролер. Запустивши файл index.php, вона перевірить, яке значення параметра id Ви їй передали. Нехай, для прикладу, це буде 5. Дізнавшись id, Контролер запустить функцію Show_News (), яка поверне змінну, наприклад, $ news з текстом новини. Далі, Контролер перевірить Ваші права на сайті - є Ви гостем, зареєстрованим користувачем або адміністратором. Припустимо, що перевіряє він, використовуючи cookie (брутальний варіант, але для прикладу підійде). Якщо Ви - гість, то Контролер більше не чіпатиме Модель, т. Е. Запустить жодної функції і більше ніяких даних згенеровано не буде. Якщо ж Ви зареєстрований на сайті, то додатково викличемо функцію Comments (), яка поверне масив $ comments з коментарями. Якщо ж Ви ще й адмін, то запустимо функцію Stat (), яка поверне масив $ stat зі статистикою. І залишилася не порушеної одна функція - Delete_Comment (), яка видаляє один коментар. Щоб вона була викликана, Контролер повинен ініціалізувати Вас як адміна, а також повинен бути переданий параметр, скажімо, del. Приклад: true-coder. ru /? del = 4. Якщо Ви адмін і параметр del був переданий Контролеру, то він запустить функцію Delete_Comment (), яка видалить коментар з id, рівним 4.

Залежно від статусу користувача (гість, звичайний користувач або адмін), дизайн сторінки буде різним. Який файл шаблону підключити, вирішує також Контролер. Якщо Ви простий гість, то він виведе дизайн лише зі змінною $ news, на місце якої буде вставлено згенерований функцією Show_News () текст новини. Якщо Ви зареєстровані, то підключиться дизайн з новиною і циклом для виведення масиву $ comments. А якщо Ви - адмін, то шаблон буде містити блок зі статистикою і посилання для видалення під кожним коментарем. Ось до речі, великий плюс у використанні технології MVC - можна на льоту повертати різні по функціоналу і зовнішньому вигляду сторінки, доступні за однією адресою.

Псевдокод Моделі (model.php) виглядає так:

У файлі шаблонів будуть виводитися лише потрібні змінні. У файлі-шаблоні для гостей - тільки змінна $ news, а в файлі-шаблоні для зареєстрованих користувачів - ще й масив $ comments.

Виводяться, наприклад, таким чином:

Таким чином, принцип MVC допомагає сильно спростити життя, в першу чергу, дизайнеру-верстальщику. Ця технологія дозволяє розділити код шаблону від php-коду, а також виносить всі призначені для користувача функції в окремий файл-бібліотеку. У подальших проектах ми будемо використовувати дану методику, т. К. На даний момент вважаємо її найбільш придатною і зручною. У майбутньому, напевно, ми розглянемо технологію шаблонізаціі і використання шаблонізатора Smarty.

Залишайтеся з нами 🙂

Поділ коду і шаблону, MVC - Частина I

Що ж таке MVC?
Чому так?
У чому суть такого поділу?
Ru /?
Ru /?