Phalcon Давайте вчитися на прикладі

Зовсім недавно на хабрі згадувався PHP MVC Framework написаний мовою C, де були описані його переваги та недоліки. Цією статтею я хочу продовжити знайомство з досить цікавим інструментом веб-розробника - PhalconPHP .

Найкращий спосіб використовувати цей посібник – пройти його крок за кроком.

Установка Phalcon PHP досить тривіальна, все зводиться до встановлення PHP розширення, яке можна завантажити з офіційного сайту.

Встановивши Phalcon PHP перевірте наявність секції «Phalcon» у результатах виведення phpinfo() або виконайте фрагмент коду нижче:

Серед інших розширень ви повинні побачити і phalcon:

Структура директорій

Phalcon не вимагає використання будь-якої певної ієрархії проекту, для розробки програми ви можете використовувати таку структуру, з якою звикли працювати.

Наприклад, у цьому уроці ми будемо використовувати таку структуру:

Зверніть увагу, що вам не потрібна директорія на кшталт «library» для розміщення фреймворку, Phalcon вже доступний з пам'яті і готовий до використання.

Красиві URL

Цей урок використовує людинозрозумілі URLs (ЧПУ). ЧПУ не тільки корисні для пошукової оптимізації, а й дозволяють користувачам простіше запам'ятовувати посилання. Підтримка ЧПУ вашим додатком не є обов'язковою, ви вільні розробляти проект і без їх підтримки.

Цей приклад використовує mod_rewrite для Apache і, виходячи з нашої структури директорій, нам знадобляться два файли .htaccess: один у корені проекту, інший у публічній директорії.

Всі запити до додатку будуть направлені до директорії public/. Цей крок гарантує, що внутрішні папки проекту залишаються прихованими від публічного доступу, знижуючи загрозу безпеці.

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

Примітка перекладача: з точки зору безпеки та продуктивності ефективніше буде винести додаток за межі public_html, залишивши доступними тільки зображення, js і css. Але не будемо відхилятися від прикладу.

Початкове завантаження (bootstrap)

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

Bootstrap-файл public/index.php виглядає так:

Нижче ми розберемо кожну частину цього файлу докладніше.

Автозавантажувач

Перша частина файлу ініціалізації – це реєстрація автозавантажувача. Він використовується для завантаження контролерів та моделей. Наприклад, ми можемо зареєструвати одну або кілька директорій контролерів, підвищуючи гнучкість програми. У нашому прикладі використаний компонент Phalcon \ Loader.

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

Управління залежностями

Працюючи з фреймворком Phalcon необхідно зрозуміти концепцію застосування залежності (Dependency injection, wiki). Це може здатися складним, але насправді все дуже просто та практично.

Phalcon містить механізм, який зберігає компоненти, необхідні для роботи програми, і надає доступ до них на запит фреймворку. Цим механізмом є клас Phalcon\DI, який виступає в ролі сполучної ланки, поєднуючи різні компоненти для їхньої спільної роботи.

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

Наступним кроком ми реєструємо компонент «view». Оскільки файли представлення не є класами, їх не можна підвантажити за допомогою автозавантажувача, тому ми повинні вказати їхнє розташування.

В останній частині цього файлу реєструється компонент Phalcon\Mvc\Application. Його мета полягає в ініціалізації оточення запиту, обробці маршруту та виконанні відповідного запиту дії. Він отримує відповідь від контролера та повертає його, коли процес буде завершено.

Як бачите, файл ініціалізації досить простий і ми не маємо необхідності підключати якісь додаткові файли. Ми підготували грунт для гнучкого MVC програми уклавшись менш ніж у 30 рядків коду.

Контролер

За промовчанням Phalcon шукає контролер та його дію під назвою «Index». Воно буде виконано, якщо у запиті не вказано контролера та дії. Найпростіший контролер виглядає таким чином:

Клас контролера має суфікс «Controller», яке дія повинна мати суфікс «Action». Якщо відкрити програму в браузері ви побачите щось таке:

Вітаю, ви літаєте з соколом!(Прим. перекладача: Phalcon співзвучно з англ. Falcon - сокіл *)

Подання (View)

Надсилання виведення на екран безпосередньо з контролера буває виправданим, але так робити не варто. Необхідні дані мають бути передані поданням, відповідальним за відображення на екрані. Phalcon буде шукати подання у файлі з тією ж назвою, що і остання виконана дія, в директорії зназвою як у останнього виконаного контролера.

У нашому випадку це app/views/index/index.phtml :

А сам контролер (app/controllers/IndexController.php) тепер містить порожню дію:

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

Форма регістрації

Змінимо уявлення app/views/index/index.phtml , додавши до нього посилання на інший контролер "signup":

Згенерований HTML-код відобразить тег із посиланням на новий контролер:

Щоб згенерувати посилання використали клас Phalcon\Tag. Цей допоміжний клас дозволяє будувати HTML відповідно до стандарту фреймворку. Тут можна знайти детальніший опис генерації HTML коду.

Так виглядає новий контролер "Signup" (app/controllers/SignupController.php):

Порожня дія «indexAction» направляє прямісінько до подання з формою (app/views/signup/index.phtml).

Відкривши цей контролер у браузері ви побачите щось подібне:

Phalcon\Tag надає корисні методи створення елементів форми. У метод Phalcon\Tag::form ми передали шлях до контролера/дії програми, яка оброблятиме форму.

Натиснувши кнопку «Register» ви побачите виняток кинуте з фреймворку, що вказує на відсутність дії «register» у контролері «signup».

PhalconException: Action “register” був невідомий на контролері “signup”

Реалізувавши цю дію ми позбудемося виключення:

Знову відправивши форму ви побачите порожню сторінку.

Введені користувачем ім'я та email повинні бути збережені у базі даних. Відповідно до принципів MVC, взаємодія з базою даних має здійснюватися моделлю програмищоб забезпечити чистий об'єктно-орієнтований код.

Phalcon приносить першу ORM для PHP, повністю написану мовою Сі. Замість збільшення складності розробки це спрощує її.

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

Модель має бути розташована в директорії app/models. Так виглядатиме модель, що надає доступ до таблиці «users»:

З'єднання з БД

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

Доповнений файл bootstrap (public/index.php) буде виглядати так:

Тепер наші моделі готові працювати і взаємодіяти з іншою частиною програми.

Збереження даних використовуючи модель

Наш наступний крок: отримання даних із форми та їх запис до таблиці. Доповнимо дію «register»:

Ніколи не можна довіряти даними, отриманими від користувача. Дані, надіслані в наш додаток, повинні пройти валідацію/фільтрацію. Це зробить додаток більш захищеним від атак типу SQL ін'єкцій.

Компонент Phalcon \ Filter робить цю задачу елементарною, так як він впроваджується з контейнера залежностей у виклик методу getPost.

Далі ми створюємо екземпляр моделі Users. Public властивості моделі відповідають полям таблиці users. Встановивши значення нової моделі та викликавши метод save() ми робимо запис до бази даних. Метод save() повертає логічне значення, яке інформує нас про те, чи успішно булаздійснено запис.

Додаткова валідація відбувається автоматично для полів, які позначені як not null (тобто обов'язкові). Якщо при надсиланні форми залишити поля незаповненими, то у браузері ви побачите повідомлення:

Sorry, the following problems були generated: name is required email is required

Висновок

Цей дуже простий урок покликаний показати, як легко почати розробляти свою програму на фреймворку Phalcon PHP. Той факт, що Phalcon є розширенням до PHP написаним на C, зовсім не суперечить простоті розробки.

Я запрошую вас продовжити вивчення керівництва, яке відкриє вам додаткові можливості пропоновані Phalcon!

___ * Сокіл найшвидший птах, і взагалі жива істота, у світі. Але, заради справедливості, варто відзначити, що в швидкості горизонтального польоту сокіл поступається стрижею.

Хардкорна конфа за С++. Ми запрошуємо лише профі.