Контейнер DependencyInjection
Регистрируйте службы и связывайте зависимости с контейнером DI Symfony
«Контейнер DependencyInjection» — бесплатный урок PHP Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.
Что такое Dependency Injection?
Dependency Injection (DI) — это шаблон, при котором класс получает зависимости извне, а не создает их внутри, благодаря чему код становится пригодным для тестирования и слабо связанным.
Компонент DI Symfony
Компонент Symfony symfony/dependency-injection предоставляет мощный контейнер IoC, который может автоматически связывать зависимости, настраивать определения сервисов и кэшировать их.
$ composer require symfony/dependency-injectionСоздание контейнера
Создайте контейнер и зарегистрируйте сервисы.
<?php
use Symfony\Component\DependencyInjection\ContainerBuilder;
$container = new ContainerBuilder();
// Register a service:
$container->register("logger", \App\Logger::class);Добавление аргументов конструктора
Передавайте аргументы конструктора в определения сервисов.
<?php
$container->register("mailer", \App\Mailer::class)
->addArgument("smtp.example.com")
->addArgument(587);Ссылки на сервисы
Внедряйте один сервис в другой с помощью Reference.
<?php
use Symfony\Component\DependencyInjection\Reference;
$container->register("email_service", \App\EmailService::class)
->addArgument(new Reference("mailer"))
->addArgument(new Reference("logger"));Получение сервиса
Получите сервис из контейнера. Зависимости разрешаются автоматически.
<?php
$emailService = $container->get("email_service");
$emailService->send("user@example.com", "Welcome!");Автоматическое связывание зависимостей
Если автоматическое связывание включено, контейнер анализирует подсказки типов и автоматически внедряет соответствующие сервисы.
<?php
$container->register(EmailService::class)
->setAutowired(true);
// Constructor is: public function __construct(Mailer $mailer, Logger $logger)Параметры
Храните значения конфигурации в качестве параметров контейнера.
<?php
$container->setParameter("mailer.host", "smtp.example.com");
$container->setParameter("mailer.port", 587);
// Reference in service definition:
$container->register("mailer", Mailer::class)
->addArgument("%mailer.host%")
->addArgument("%mailer.port%");Конфигурация YAML
Определяйте сервисы в YAML (требуются symfony/config и symfony/yaml).
# services.yaml
services:
App\Mailer:
arguments:
- "%mailer.host%"
- "%mailer.port%"Компиляция контейнера
Скомпилируйте контейнер для повышения производительности. Это проверяет определения и оптимизирует граф сервисов.
<?php
$container->compile();
// Dump to PHP cache file:
$dumper = new PhpDumper($container);
file_put_contents("CachedContainer.php", $dumper->dump());Общие и необщие сервисы
По умолчанию сервисы являются общими (одиночными экземплярами). Установите shared(false), чтобы при каждом получении сервиса создавался новый экземпляр.
Итоги
Контейнер DI Symfony регистрирует, связывает и разрешает сервисы. Для удобства используйте автоматическое связывание, для конфигурации — параметры, а в рабочей среде компилируйте контейнер ради производительности.
Быстрая проверка
Что делает автоматическое связывание зависимостей в контейнере DI Symfony?
Часто задаваемые вопросы
Урок «Контейнер DependencyInjection» бесплатный?
Да — полный текст урока «Контейнер DependencyInjection» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.
Чему я научусь в уроке «Контейнер DependencyInjection»?
Регистрируйте службы и связывайте зависимости с контейнером DI Symfony Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать PHP Academy?
Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Контейнер DependencyInjection»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке PHP Academy?
Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- HttpFoundation: запрос и ответ
- Контейнер DependencyInjection
- EventDispatcher: слабо связанные события
- Компонент Console: команды CLI