Як написати найпростіший шаблонизатор на php - все про web розробці на

Після статті Як написати свій фреймворк на php. один знайомий програміст поставив мені таке питання: а як працює шаблонизатор в Yii. а конкретно функція render ( "filename", $ variables = array ())?

Якщо заглибитися в історію php (а він був написаний як шаблонизатор в мові perl), то буде ясно, кращого шаблонізатора, ніж сама мова на ньому не написати. Smarty і т.п. бібліотеки, обмежені своїм API. І робота з ними нагадує історія про Active Record, яку я описав в попередній статті.

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

Створимо клас, і відразу опишемо методи, якими він буде володіти.

з цими методами знаком програміст працює з Yii. Метод render виводить всю сторінку, включаючи в спеціально відведене місце вміст файлу $ filename. Метод renderPartial просто виводить вміст файлу $ filename на екран. За своєю суттю, метод render це послідовний renderPartial ($ filename) і renderPartial ( 'index'). Отже, для роботи шаблонізатора, нам буде потрібно описати цей метод.

Основа його роботи просте підключення необхідного файлу методом include, а щоб змінні були доступні в ньому самостійно, а не як частини масиву, використовується призабута функція extract

Щоб загнати вміст файлу в змінну, використовується відомий прийом з ob_start () ob_get_clean (). Це такі функції, які заганяють стандартний потік виведення в інші рейки. Кажучи іншою мовою, вони буферизується висновок. Подібно до того, як в windows дані містяться в буфер обміну. Детальніше про це можна почитати тут

тобто якщо параметр

залишити без змін, то вони і не задіюються. Але якщо його встановити в false, то все, що виведе файл $ filename.php не піде в основний потік, а буде зібрано і повернуто методом renderPartial. Чи не правда, дуже зручно !?

Ось і вся магія. Тепер опишемо метод render

Як і писав вище, двічі викликаємо метод renderPartial. Спершу з output == false, для цільового файлу. Другий раз викликаємо з тим же, що був поданий в сам render. У файлі main.php, вміст файлу $ filename.php буде доступно в змінній $ content.

Це не найвеселіше, що можна зробити. Що, якщо в змінну $ content заганяти екземпляр класу, зі створеним методом __toString. Можна буде зробити рендер в нормальному порядку. Спершу main а потім $ filename в ньому. Так як і повинно бути.

Але залишу це для вашої фантазії.

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

Ви все ще не форкнулі цей фреймворк. Чого ж ви чекаєте? Давайте зробимо ідеальний фреймворк разом.