Что такое бандл (bundle)

Как мы уже могли отметить в предыдущей главе, запуск Symfony-приложения означает загрузку ядра и обработку запроса или выполнение команд. В свою очередь, загрузка ядра означает загрузку всех бандлов и регистрацию их расширений сервисного контейнера (которые в любом бандле расположены в директории DependencyInjection).

Обычно расширение контейнера загружает файл services.xml (однако, формат может быть и другим) и конфигурацию бандла, которая представлена двумя классами, как правило в одном и том же пространстве имён — Configuration. Всё это вместе (бандл, расширение контейнера и конфигурация) может быть использовано для того, чтобы связать бандл с прочими частями приложения: вы можете определять параметры и сервисы, чтобы функции из вашего бандла были бы доступны также и в других частях приложения. Вы можете двинуться ещё дальше и регистрировать дополнительные «этапы компилятора» (compiler passes) для того, чтобы модифицировать сервисный контейнер, до того как он примет окончательный вид.

После создания множества бандлов я понял, что бОльшая часть моей работы, как разработчика Symfony-приложений, состоит в написании кода в основном для трёх вещей: бандлов, расширений и классов конфигурации (а также их compiler passes). Если вы уже знаете, как писать хороший код, вам всё ещё нужно узнать, как создавать хорошие бандлы, и это в основном означает, что вам нужно знать как создавать хорошие определения ваших сервисов. Имеется много способов определния сервисов и далее в этой главе я расскажу о большинстве из них. Зная все возможности, вы можете сделать правильный выбор, применительно к конкретно взятой ситуации.

Не используйте команды генерации

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