Понимание того, как работают вместе фронт контроллер, ядро и окружения

Раздел How to Master and Create new Environments объяснял основы того, как Symfony использует окружения для запуска вашего приложения с разными настройками конфигурации. Этот раздел расскажет немного больше о том, что случается, когда ваше приложение самозагружается. Чтобы подключиться к этому процессу, вам нужно понять три части, работающие вместе:

Note

Обычно вам не понадобится определять ваш собственный фронт контроллер или класс Kernel, так как Symfony предоставляет благоразумные реализации по умолчанию.

Эта статья предоставлена для того, чтобы объяснить, что происходит за кулисами.

Фронт контроллер

Фронт контроллер - это схема; он является разделом кода, через который проходят все запросы, обслуживаемые приложением.

В Скелетоне Symfony эту роль перенимает файл index.php в каталоге public/. Этот PHP-скрипт выполняется самым первым при обработке запроса.

Главной целью фронт контроллера является создание экземпляра Kernel (больше об этом через секунду) для обработки запроса и возвращения результирующего ответа в браузер.

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

  • Конфигурацию автозагрузчика или добавление дополнительных механизмов автозагрузки;
  • Добавление HTTP-уровня кеширования, обернув ядро экземпляром HttpCache;
  • Подключение Компонента Отладки.

Вы можете выбрать используемый фронт-контроллер, добавив его в URL:

1
http://localhost/index.php/some/path/...

Как вы можете увидеть, этот URL содержит PHP-скрипт, который будет использован как фронт-контроллер. Вы можете использовать это, чтобы легко переключаться на пользовательский фронт-контроллер, расположенный в каталоге public/.

Вам почти никогда не стоит отображать фронт-контроллер в URL. Это достигается путём конфигурирования веб-сервера, как показано в Configuring a Web Server.

Формально, скрипт bin/console, используемый при запуске Symfony в командной строке, - это тоже фронт контроллер, только используемый не для сети, а для запросов командной строки.

Класс Kernel

Класс Kernel - это ядро Symfony. Он отвечает за пакеты, используемые вашим приложением, и предоставляет им конфигурацию приложения. Он создаёт сервис-контейнер до обслуживания запросов в своём методе handle().

Ядро, используемое в приложениях Symfony расширяется из Kernel и использует MicroKernelTrait. Класс Kernel оставляет некоторые методы из KernelInterface нереализованными, а MicroKernelTrait определяет несколько абстрактных методов, так что вы должны реализовать их все:

registerBundles()
Должен вернуть массив всех необходимых для запуска приложения пакетов.
configureRoutes()
Добавляет индивидуальные маршруты или коллекции маршрутов в приложение (например, загрузку маршрутов, определённых в некотором файле конфигурации).
configureContainer()
Хагружает конфигурацию приложения из файлов конфигурации или используя метод loadFromExtension() и может также регистрировать новые параметры контейнера и сервисы.

Чтобы заполнить эти (небольшие) пробелы, ваше приложение должно создать подкласс Kernel и реализовать эти методы. Результирующий класс по договёрности называется AppKernel.

Этот класс использует имя окружения, которое передаётся методу ядра constructor и которое доступно через getEnvironment(), чтобы решить, какие пакеты создавать. Логика для этого находится в registerBundles().

Вы, конечно же, вольны создавать ваши собственные альтернативные или дополнительные варианты Kernel. Всё, что вам нужно - это адаптировать (или добавить новый) ваш фронт контроллер, чтобы воспользоваться новым ядром.

Note

Имя и местоположение Kernel не фиксированы. При добавлении нескольких ядер в одно приложение, может иметь смысл добавить дополнительные подкаталоги, например, app/admin/AdminKernel.php и app/api/ApiKernel.php. Имеет значение только то, чтобы ваш фронт-контроллер мог создать экземпляр правильного ядра.

Note

Kernel можно использовать для большего, например, для переопределения структуры каталога по умолчанию. Но высока вероятность того, что вам не понадобится изменять такие вещи на лету, имея несколько реализаций Kernel.

Окружения

Как было отмечено только что, Kernel должен реализовать другой метод - configureContainer(). Этот метод отвечает за загрузку конфигурации приложения из правильного окружения.

Окружения подробно описывались в предыдущей статье, и вы наверное помните, что Symfony по умолчанию использует три: dev, prod и test.

По факту, эти имена - не более, чем строки, переданные из фронт контроллера в конструктор Kernel. Это имя может потом быть использовано в методе configureContainer(), чтобы решить, какие файлы конфигурации стоит загружать.

Класс Symfony Kernel по умолчанию реализует этот метод загружая вначале файлы конфигурации, найденные в config/packages/*, а потом файлы, найденные в config/packages/ENVIRONMENT_NAME/. Вы, конечно же, вольны реализовывать этот метод по-другому, если вам нужен более утончённый способ загрузки вашей конфигурации.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.