В 18-м уроке мы разберем одну из ключевых концепций Symfony, это бандлы. Этот урок станет основой для понимания модульности фреймворка и я уверен, что после него вы сможете использовать сторонние решения и создавать свои собственные компоненты как профи.
Что такое бандлы?
Бандл (Bundle) в Symfony это структурная единица, которая объединяет код, конфигурации,
шаблоны и ресурсы в одном месте. Представьте его как плагин или модуль, который можно
подключить к проекту, чтобы расширить функционал.
Зачем нужны бандлы?
- Модульность. Каждый бандл решает свою задачу (админ-панель, аутентификация, API).
- Переиспользование. Бандлы можно делиться между проектами или сообществом.
- Изоляция. Код бандла не «засоряет» ядро приложения.
Структура бандла:
MyBundle/ ├── Controller/ # Контроллеры ├── Entity/ # Сущности Doctrine ├── Resources/ │ ├── config/ # Конфигурации │ ├── public/ # CSS, JS, изображения │ └── views/ # Шаблоны Twig ├── DependencyInjection/ # Расширение контейнера └── MyBundle.php # Класс бандла
Бандл FrameworkBundle содержит базовые компоненты Symfony (роутинг, шаблоны, консоль).
Установка сторонних бандлов
Symfony имеет богатую экосистему готовых решений. Рассмотрим установку EasyAdmin, популярного
бандла для создания админ-панелей.
Шаг 1: Установка через Composer
composer require easycorp/easyadmin-bundle
Шаг 2: Регистрация бандла
Файл config/bundles.php автоматически обновится:
return [ // ... EasyCorp\Bundle\EasyAdminBundle\EasyAdminBundle::class => ['all' => true], ];
Шаг 3: Настройка
Создайте файл config/packages/easy_admin.yaml:
easy_admin: site_name: 'My Admin Panel' entities: - App\Entity\Product # Ваша сущность
Шаг 4: Создание контроллера админки
// src/Controller/AdminController.php namespace App\Controller; use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractDashboardController; use Symfony\Component\HttpFoundation\Response; class AdminController extends AbstractDashboardController { public function index(): Response { return $this->render('admin/dashboard.html.twig'); } }
Практическая задача:
- Установите EasyAdmin.
- Добавьте в админку 2 сущности из вашего проекта.
- Настройте отображение полей через
configureCrud().
Создание собственного бандла
Теперь создадим свой бандл BlogBundle для управления статьями.
Шаг 1: Генерация бандла
Запустите консольную команду:
php bin/console generate:bundle
Укажите название (BlogBundle), пространство имен (App\BlogBundle) и выберите формат конфигурации (YAML).
Шаг 2: Структура
Symfony создаст папку src/BlogBundle с базовой структурой.
Шаг 3: Добавление функционала
Создайте контроллер для статей:
// src/BlogBundle/Controller/ArticleController.php namespace App\BlogBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Routing\Annotation\Route; class ArticleController extends AbstractController { #[Route('/articles', name: 'blog_articles')] public function list(): Response { // Логика выборки статей return $this->render('@BlogBundle/articles/list.html.twig'); } }
Шаг 4: Регистрация роутов
Добавьте в config/routes.yaml:
blog_bundle: resource: '@BlogBundle/Resources/config/routes.yaml' prefix: /blog
Практическая задача:
- Создайте бандл
NewsBundleс CRUD для новостей. - Реализуйте страницу детального просмотра новости.
Публикация бандлов на Packagist
Хотите поделиться своим бандлом с миром? Разместите его на Packagist, основном репозитории пакетов PHP.
Шаг 1: Подготовка composer.json
Убедитесь, что в корне бандла есть composer.json:
{ "name": "max-gabov/blog-bundle", "description": "Бандл для управления блогом", "type": "symfony-bundle", "require": { "php": ">=8.1", "symfony/framework-bundle": "^6.3" }, "autoload": { "psr-4": { "App\\BlogBundle\\": "src/" } } }
Шаг 2: Тегирование версий в Git
git tag v1.0.0 git push origin --tags
Шаг 3: Публикация на Packagist
- Зарегистрируйтесь на Packagist.org.
- Нажмите «Submit» и укажите URL вашего Git-репозитория.
Используйте семантическое версионирование (major.minor.patch).
Практические примеры
Пример 1: Сервис в бандле
Создайте сервис ArticleManager:
// src/BlogBundle/Service/ArticleManager.php namespace App\BlogBundle\Service; class ArticleManager { public function getFeaturedArticles(): array { // Логика получения статей return []; } }
Зарегистрируйте его в Resources/config/services.yaml:
services: App\BlogBundle\Service\ArticleManager: tags: ['controller.service_arguments']
Сегодня вы узнали:
- Как работать с бандлами в Symfony.
- Устанавливать сторонние решения (EasyAdmin).
- Создавать и публиковать свои бандлы.
Готовы углубиться в Symfony? Полный курс по Symfony для начинающих
Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.


