Первое, что выделяет данный PHP-фреймворк среди толпы остальных — это гибкая архитектура Symfony2, которая позволяет быстро разрабатывать приложения. В этой статье мы коротко расскажем о ее основных особенностях.
Symfony Components
Работа Symfony2 основана на использовании разделенных (decoupled) компонентов многократного использования — Symfony Components. Все они решают распространенные проблемы, с которыми приходиться сталкиваться в процессе веб-разработки. Кстати, некоторые другие PHP-фреймворки используют компоненты Symfony2, например:
- 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 реализована весьма типичным образом, хотя имеет гибкие настройки:
app/
— здесь вы найдете все данные по конфигурации приложения.
src/
— исходный код.
web/
— корневая web-директория.
Особенности web-директории
В корневой 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. И это звание только лишний раз подчеркивается той гибкостью, которая имеется при использовании уже существующих бандлов или при создании новых. Исключительная гибкость — это то, что позволяет вам самостоятельно настроить особенности приложения и выполнить оптимизацию так, как будет удобно именно вам. Составными частями ядра фреймворка также являются FrameworkBundle, DoctrineBundle, SwiftmailerBundle, AsseticBundle.
Написав на XML, YAML или PHP конфигурационные файлы, вы сможете по отдельности настроить каждый бандл. Для наглядности посмотрите на конфигурацию по умолчанию:
app/config/config.yml
Каждая запись, имеющаяся в config.yml, отвечает за точную настройку бандла. Стандартную конфигурацию задает каждое окружение, определяя настройку при помощи специфического конфигурационного файла.
В конечном счете необходимо усвоить, что приложение состоит из множества бандлов, которые определяются методом registerBundles()
. Гибкая платформа Symfony2 позволяет вам самостоятельно выбирать, где вы будете хранить бандлы, какими именно вы будете делиться между своими приложениями и то, какие настройки вы выберете для каждой отдельной ситуации.
Вот некоторые из самых популярных бандлов по результатам опроса разработчиков:
- FOSUserBundle (60%)
- FOSRestBundle (30%)
- KnpMenuBundle (25%)
- StofDoctrineExtensionsBundle (25%)
- JMSSerializerBundle (24%)
- SonataAdminBundle (24%)
Принцип работы кэша и логов
На данный момент можно с уверенностью сказать, что Symfony2 является одним из самых быстрых и функциональных фреймворков. Но что же дает этой платформе такую большую скорость, если учесть, что ей приходится анализировать и интерпретировать десятки XML и YAML под каждый запрос?
Частично на этот вопрос поможет ответить система кэширования. Анализ приложения происходит только при первом запросе, далее информация компилируется в оптимизированый PHP код и сохраняется в соответствующей папке app/cache/. Среда разработки Symfony2 достаточно интеллектуальна, чтобы своевременно очищать кэш при внесении изменений в файл. Для устранения возникающих проблем или ошибок, загляните в папку app/logs/ — в ней хранятся все логи о запросах.
Как выглядит интерфейс командной строки?
Удобная командная строка также облегчает обслуживание приложения. Консоль позволяет автоматизировать процесс работы, анализируя и предоставляя команды, которые вы наиболее часто используете. Чтобы понять возможности консоли, запустите ее без аргументов:
Для уточнения способностей команды просто используйте встроенную опцию --help
.
Архитектура Symfony2 в диаграммах
И напоследок давайте взглянем, как выглядит архитектура Symfony2 на диаграммах. Обычно приложение состоит из трех главных компонентов:
Все запросы, которые поступают к приложению, вначале попадают на фронт-контроллер, который создает экземпляр AppKernel для обработки запроса:
Подведем итоги. Как видно из представленного выше материала, Symfony2 позволяет точно настраивать работу приложения согласно вашим потребностям. Вы сами решаете, как будут называться директории и где они будут размещаться, а также какие компоненты Symfony будут использоваться в вашем проекте.