Урок 18: Бандлы (Bundles) в Symfony

В 18-м уроке мы разберем одну из ключевых концепций Symfony, это бандлы. Этот урок станет основой для понимания модульности фреймворка и я уверен, что после него вы сможете использовать сторонние решения и создавать свои собственные компоненты как профи.

Что такое бандлы?

Бандл (Bundle) в Symfony это структурная единица, которая объединяет код, конфигурации,
шаблоны и ресурсы в одном месте. Представьте его как плагин или модуль, который можно
подключить к проекту, чтобы расширить функционал.

Зачем нужны бандлы?

  1. Модульность. Каждый бандл решает свою задачу (админ-панель, аутентификация, API).
  2. Переиспользование. Бандлы можно делиться между проектами или сообществом.
  3. Изоляция. Код бандла не «засоряет» ядро приложения.

Структура бандла:

MyBundle/  
├── Controller/          # Контроллеры
├── Entity/              # Сущности Doctrine
├── Resources/  
│   ├── config/          # Конфигурации
│   ├── public/          # CSS, JS, изображения
│   └── views/           # Шаблоны Twig
├── DependencyInjection/ # Расширение контейнера
└── MyBundle.php         # Класс бандла

Бандл FrameworkBundle содержит базовые компоненты Symfony (роутинг, шаблоны, консоль).

Установка сторонних бандлов

Symfony имеет богатую экосистему готовых решений. Рассмотрим установку EasyAdmin, популярного
бандла для создания админ-панелей.

Шаг 1: Установка через Composer

bash
composer require easycorp/easyadmin-bundle

Шаг 2: Регистрация бандла

Файл config/bundles.php автоматически обновится:

php
return [
    // ...
    EasyCorp\Bundle\EasyAdminBundle\EasyAdminBundle::class => ['all' => true],
];

Шаг 3: Настройка

Создайте файл config/packages/easy_admin.yaml:

yaml
easy_admin:
    site_name: 'My Admin Panel'
    entities:
        - App\Entity\Product  # Ваша сущность

Шаг 4: Создание контроллера админки

php
// 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');
    }
}

Практическая задача:

  1. Установите EasyAdmin.
  2. Добавьте в админку 2 сущности из вашего проекта.
  3. Настройте отображение полей через configureCrud().

Создание собственного бандла

Теперь создадим свой бандл BlogBundle для управления статьями.

Шаг 1: Генерация бандла

Запустите консольную команду:

bash
php bin/console generate:bundle

Укажите название (BlogBundle), пространство имен (App\BlogBundle) и выберите формат конфигурации (YAML).

Шаг 2: Структура

Symfony создаст папку src/BlogBundle с базовой структурой.

Шаг 3: Добавление функционала

Создайте контроллер для статей:

php
// 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:

yaml
blog_bundle:
    resource: '@BlogBundle/Resources/config/routes.yaml'
    prefix: /blog

Практическая задача:

  1. Создайте бандл NewsBundle с CRUD для новостей.
  2. Реализуйте страницу детального просмотра новости.

Публикация бандлов на Packagist

Хотите поделиться своим бандлом с миром? Разместите его на Packagist, основном репозитории пакетов PHP.

Шаг 1: Подготовка composer.json

Убедитесь, что в корне бандла есть composer.json:

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

bash
git tag v1.0.0
git push origin --tags

Шаг 3: Публикация на Packagist

  1. Зарегистрируйтесь на Packagist.org.
  2. Нажмите «Submit» и укажите URL вашего Git-репозитория.

Используйте семантическое версионирование (major.minor.patch).

Практические примеры

Пример 1: Сервис в бандле

Создайте сервис ArticleManager:

php
// src/BlogBundle/Service/ArticleManager.php
namespace App\BlogBundle\Service;

class ArticleManager
{
    public function getFeaturedArticles(): array
    {
        // Логика получения статей
        return [];
    }
}

Зарегистрируйте его в Resources/config/services.yaml:

yaml
services:
    App\BlogBundle\Service\ArticleManager:
        tags: ['controller.service_arguments']

Сегодня вы узнали:

  1. Как работать с бандлами в Symfony.
  2. Устанавливать сторонние решения (EasyAdmin).
  3. Создавать и публиковать свои бандлы.

Готовы углубиться в Symfony? Полный курс по Symfony для начинающих

Поделиться статьей:
Поддержать автора блога

Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.

Персональные рекомендации
Оставить комментарий