Загрузка определений сервисов из бандла
Если вы хотите загружать сервисы из своего бандла, а не определять их в config/services.yaml, необходимо создать расширение внедрения зависимостей (Dependency Injection Extension). Подробную документацию по этой теме можно найти в официальном руководстве Symfony по расширениям.
В качестве примера рассмотрим создание расширения для App, которое загружает файл конфигурации config/services.yaml.
Во-первых, нам нужно создать класс расширения. Имя класса расширения по соглашению должно находиться в подпространстве имен DependencyInjection и называться так же, как класс бандла, но с заменой суффикса Bundle на Extension.
Итак, для вашего MyBundle мы создадим следующее расширение:
<?php
// src/MyBundle/DependencyInjection/AppExtension.php
namespace MyBundle\DependencyInjection;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
class AppExtension extends Extension
{
public function load(array $configs, ContainerBuilder $container): void
{
// Создаем YamlFileLoader (можно использовать XmlFileLoader для XML-файлов)
$loader = new YamlFileLoader(
$container,
// Указываем путь к папке с конфигурацией: src/MyBundle/Resources/config
new FileLocator(__DIR__ . '/../Resources/config')
);
// Загружаем services.yaml
$loader->load('services.yaml');
// Здесь можно добавить дополнительные вызовы load(), если это необходимо
}
}
Далее мы создаем конфигурационный файл, который пытаемся загрузить:
# config/services.yaml
services:
my_custom_class:
class: MyBundle\Custom\Class
После создания этих файлов services.yaml будет загружаться автоматически при инициализации бандла, и сервис my_custom_class будет зарегистрирован в контейнере приложения.
Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.