
Гнучка архітектура є найпомітнішою особливістю фреймворку Symfony2. Вона допомагає цьому PHP-фреймворку виділятися та дозволяє розробникам швидко створювати функціональні додатки. Ця тема заслуговує окремої статті, тому тут ми зануримося в деякі деталі архітектури Symfony2.
Компоненти Symfony
Symfony2 працює на основі окремих декомпозованих компонентів, які є багаторазовими. Їх називають компонентами Symfony. Всі вони допомагають вирішувати типові завдання, з якими можна зіткнутися під час розробки для вебу. До речі, деякі інші PHP-фреймворки використовують компоненти Symfony:
- Silex (BrowerKit, CssSelector, DomCrawler, EventDispatcher, HttpFoundation, HttpKernel, Routing, Form, Translation та Validator).
- Behat (Console, DependencyInjection, EventDispatcher, Finder, Yaml, Config та Translation).
- FLOW3 (YAML).
Популярна CMS Drupal8 також використовує такі компоненти Symfony2, як HttpKernel, HttpFoundation, EventDispatcher, YAML, Routing, Twig тощо.
Але щоб отримати максимальну вигоду від Symfony2, ви повинні використовувати його в повному обсязі, а не покладатися на окремі компоненти. Таким чином, ви отримаєте перевагу тісної інтеграції всіх компонентів прямо з коробки. Тепер давайте заглянемо всередину сервісно-орієнтованої архітектури Symfony2.
Структура директорії
Перше, що потрібно згадати, це структура директорії. У Symfony2 вона реалізована в типовому вигляді, але має досить гнучкі налаштування:
app/
— тут ви знайдете всі дані про конфігурацію додатку.
src/
— вихідний код.
web/
— коренева веб-директорія.
Особливості веб-директорії
Коренева веб-директорія містить усі публічні та статичні файли, які використовуються стилями та завантажуються в них, файли JavaScript та фронтальний контролер.
web/app.php
Архітектура фреймворку Symfony2 базується на фронтальному контролері web/app.php
. Основна точка входу в конфігурацію додатку — це клас AppKernel
. Вхідні параметри конструктора: prod
— ініціалізація середовища, в якому буде працювати додаток; другий параметр визначає, чи використовувати дані для налагодження під час роботи. Метод handle
отримує об'єкт класу Request
, сформований з глобальних змінних, і повертає об'єкт класу Response
клієнту. Клас AppKernel
повинен реалізувати два методи:
registerBundles
— повертає масив пакетів, необхідних для роботи.
app/AppKernel.php
registerContainerConfiguration
— завантажує конфігурацію програми, що відповідає середовищу, переданому конструктору з каталогу app/config.
Автозавантаження класів PHP виконується за допомогою Composer. Усі залежності розташовані в каталозі vendor, хоча це лише домовленість. Іншими словами, ви можете самостійно вибрати каталог зберігання. Це може бути глобальний каталог або розташований у локальній папці проекту.
Завдяки використанню архітектури, орієнтованої на сервіси, функції Symfony2 організовані в модулі, які розділені на незалежні сервіси. Вони становлять основу Symfony2.
Чому пакет, а не плагін?
У архітектурі Symfony2 концепція пакета відіграє важливу роль. Але деякі розробники можуть запитати: чому використовувати пакет, а не знайомий плагін? Пакет схожий на плагін, але має одну помітну особливість: у Symfony2 все може бути пакетом. Це можуть бути спеціальні функції фреймворку або код, який ви пишете безпосередньо в додатку.
Особливий статус пакетів у Symfony2 цілком виправданий. Можливо налаштувати як нові, так і вже створені пакети. Ця виняткова гнучкість дозволяє вам встановлювати функції вашого додатку та виконувати оптимізацію так, як вам потрібно. Ядро фреймворку також включає наступні компоненти: FrameworkBundle, DoctrineBundle, SwiftmailerBundle, AsseticBundle.
Після написання файлів конфігурації за допомогою XML, YAML або PHP ви можете налаштувати кожен пакет окремо. Наприклад, зверніть увагу на стандартну конфігурацію:
app/config/config.yml
Кожен запис у config.yml відповідає за точну конфігурацію пакета. Стандартна конфігурація встановлюється для кожного середовища на основі конкретного файлу конфігурації.
В кінцевому підсумку додаток складається з кількох пакетів, визначених методом registerBundles()
. Гнучка платформа Symfony2 дозволяє вам вибрати, де зберігати пакети, які з них ваші додатки будуть спільно використовувати та які налаштування використовувати в кожній конкретній ситуації.
Ось деякі з найпопулярніших пакетів серед спільноти Symfony:
- FOSUserBundle (60%)
- FOSRestBundle (30%)
- KnpMenuBundle (25%)
- StofDoctrineExtensionsBundle (25%)
- JMSSerializerBundle (24%)
- SonataAdminBundle (24%)
Як працюють кеш і журнали
Symfony2 безумовно є одним з найшвидших багатофункціональних фреймворків, доступних сьогодні. Але що надає йому таку швидкість, враховуючи, що йому потрібно аналізувати та інтерпретувати десятки XML і YAML для кожного запиту?
Система кешування частково відповідає за це. Застосунок аналізується лише під час першого запиту. Потім вся інформація компілюється в оптимізований PHP код і зберігається в відповідній папці app/cache/. Середовище Symfony2 досить розумне, щоб своєчасно очищати кеш, коли файли змінюються. Для усунення проблем і помилок вам слід відкрити папку app/logs/, де зберігаються всі журнали запитів.
Як виглядає інтерфейс командного рядка?
Зручний у використанні командний рядок допомагає в обслуговуванні застосунку. Консоль дозволяє автоматизувати робочий процес, виконуючи аналіз і надаючи найчастіше використовувані команди. Щоб зрозуміти її можливості, запустіть консоль без аргументів:
Щоб уточнити можливості команди, використовуйте вбудований --help
параметр.
Діаграми архітектури Symfony2
І нарешті, давайте подивимося на візуалізацію архітектури Symfony2. Ось перша діаграма архітектури Symfony2, яка показує три основні компоненти, які ви можете знайти в більшості застосунків:
Усі запити, які отримує застосунок, надсилаються до фронт-контролера, який створює екземпляр AppKernel для обробки конкретного запиту та повернення відповіді:
Підсумуємо, що ми дізналися. Як ви можете бачити з наведених вище прикладів, Symfony2 дозволяє розробникам дуже точно налаштовувати застосунки. Ви самі обираєте, як називати директорії та де вони будуть розташовані, а також які компоненти включати в кожен конкретний проект.