Як написати свій фреймворк на php

У попередніх постах ми розробили мінімальну структуру фреймворка. У цій статті, наведемо трохи лиску - додамо простеньку тему з bootstrap'ом, меню і докладніше розглянемо роботу шаблонізатора і роутера (маршрутизатора сайту).

У минулій статті ми створили роутер. який використовуючи логіку регулярних виразів розпізнає входить sef посилання і направляє на потрібний контролер і його метод.

Тобто з такого рядка

роутер робить масив

Ми не стали в минулий раз писати приклад використання такого рішення. Виправимо ситуацію, але перед цим доопрацюємо роутер.

Перенесемо масив правил роутера в конфігураційний файл фреймворка. Цей масив заповнюватимуть розробники, які будуть писати сайти на нашому фреймворку. Тому він повинен бути максимально доступний.

Крім того ви можете бачити, що ми змінили праву частину масиву.

Внесемо зміни в код роутера. а потім розберемо його роботу.

По-перше ми заповнюємо масив вихідних даних значеннями по умолчантю, які беремо з нашого config.php. Потім ми Парс вхідний $ path на наявність get змінних. Якщо вони є, то їх просто потрібно додати до масиву вихідних даних. parse_url - розділяє url на складові. Однією з таких складових є query. Це все що в URL йде після знака питання

Цей рядок key = value параметрів в свою чергу парсит функція parse_str

C query частиною рядка розібралися, тепер використовуючи правила регулярних виразів, виділимо з роблячи необхідні дані.

На 12 сходинці ми бачимо перебір всіх правил з конфіга. На 13 перевіряємо - чи підходить чергове правило. Якщо так, то беремо масив результатів і по черзі замінюємо його елементами - праву частину правила.

Спрацювало правило '([a-z0-9 + _ \ -] +) / ([a-z0-9 + _ \ -] +) / ([0-9] +)' => '$ controller / $ action / $ id ',

Тоді масивом результатів застосування його лівій частині до вхідному рядку / user / profile / 15 буде масив

Перебираючи цей масив, починаючи з другого елементу, замінюємо в правій частині правила $ controller / $ action / $ id ключі $ ([a-z] +)

Тобто на рядку 14, при кожній заміні, права частина правила буде змінюватись так

На перший погляд - це безглузді дії. Яку рядок пустили на вхід / user / profile / 15 таку і отримали на виході правила

Але це тільки на перший погляд. На виході ми отримали стандартизований URI, застосувавши до якого операцію explode, отримаємо в першому елементі назву контролера, у другому - методу, в тертий - id

Для більшої ясності, додамо в кінець масиву правил в config.php, правило

В результаті роботи цього правила, наш роутер любуй запит html сторінки (наприклад /about.html без вказівки контролера і методу), направить в контролер page і метод read, а в параметр id піде рядок about

Ми використовуємо це для створення прикладу блогу на основі нашого фреймворка. Однак спершу, покращимо шаблонизатор

шаблонизатор

Щоб почати робити шаблон для нашого фреймворка, нам потрбуется якась зверстана html сторінка. Наприклад візьмемо безкоштовну тему з сайту бутсрапа

Тисніть ctrl + u в своєму браузері і просто копіюйте весь вихідний код в файл viws / main.php - це і є шаблон. Але його ще потрібно доопрацювати. Видалимо всі підключення стилів і скриптів через html розмітку. Ми будемо підключати необхідні скрипти через php. Це дає певну упевненість, що в будь-якому шаблоні завжди буде присутній набір файлів вашого фреймворка, незалежно від того, чи використовував їх верстальник при верстці.

Для стилів і скриптів в корені проекту створимо окрему папку. Зазвичай її називають assets. а в ній папки - css - для стилів, js - для скриптів, і images - для зображень. При цьому останню папку потрібно використовувати тільки для тих зображень, які беруть участь в дизайні сайту, а не в його наповненні. Для наповнення краще виділити окрему директорію - media / images в корені сайту.

Скачемо свіжий бутстрап і останню версію jquery. Кладемо їх в папку assets / js / libs /. Інші стилі теми вам доведеться завантажити самостійно.

Всі стилі і скрипти лежать по своїх папок, але як же їх підключити. У нашому шаблонизатор немає таких методів. Їх необхідно написати. Додавати їх ми будемо в файл ideal / classes / controller.php. Додамо наступні методи

  • private function addAsset ($ link, $ where = 'head', $ asset = 'script', $ type = 'url')
  • public function addScript ($ link, $ where = 'head')
  • public function addStyleSheet ($ link, $ where = 'head')
  • public function addScriptDeclaration ($ link, $ where = 'head')
  • public function addStyleSheetDeclaration ($ link, $ where = 'head')

Писати код нам доведеться для методу addAsset, всі інші методи - це виклик addAsset з різними параметрами, і зроблені скоріше для зручності.

Додамо до класу наступне поле

У ньому будуть зберігатися дані про всіх підключаються стилях і скриптах. Далі код addAsset

$ Hash - обчислюється лише для того, щоб не підключати до сторінці одні і ті ж скрипти двічі. $ Where - це місце, куди ми підключаємо скрипти. перед або перед тобто в початок або в кінець документа.

Далі методи по порядку

Методу addAsset лише заповнює масив $ assets даними, але ці дані ще необхідно застосувати. Тому перепишемо метод render. Раніше, він у нас виводив main.php. Це не зовсім вірно. Зробимо для це цілі ще один метод renderPage

Метод використовуючи дані з assets, генерує необхідні теги підключення скриптів (або віддалений файл, або inline) і додає їх в потрібне місце документа

Метод, буде викликатися всередині методу start класу App, після запуску і відпрацювання контролера.

Метод start з ideal / classes / App.php

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

  • App :: gi () -> uri-> controller - назва контролера
  • App :: gi () -> uri-> action - назва методу контролера
  • App :: gi () -> uri-> id - якийсь ідентифікатор

І будь-які інші змінні запиту, також будуть достапни, через це поле. Це можна використовувати наприклад для визначення активного пункту меню.

Далі вже знайома нам комбінація ob_start - виклик методу контролера - ob_get_clean, і результат роботи контролера, передається в renderPage

Ще ви повинно бути помітили підключення деяких скриптів і стилів на рядках з 10 по 19. Ці ті зовнішні стилі і скрипти, які будуть підключаться через config.php. І зроблено це швидше просто для зручності використання фреймворка. Наприклад ми можемо винести підключення jquery і bootstrap "за дужки" в config.php і вони будуть підключаться до будь-якої нашої теми, до будь-якій сторінці, згенерованої нашим фреймворком. Зручно, чи не так ?!

З огляду на структуру папок, яку ми організували вище, в config.php ми допишемо наступні два масиви

Так як фреймворк вже прийняв гідний вигляд, то можна його викласти на загальний огляд. Тепер його роботу можна споглядати тут

контролер page

Коли ми додали ще одне правило в наш роутер, згадувався якийсь контролер page і його метод read. Він досить простий, створимо його в папці application / controllers / PageController.php

там же створюємо ще одну папку views / page / pages. а в ній потрібні сторінки. Наприклад about.php

Тексти програм кінцевого фреймворка подивитися і скачати

Як розробити фреймворк

Схожі статті