0Pricing
PHP Academy · Урок

Контейнер 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 — локальная установка не требуется.

Все уроки этого курса

  1. HttpFoundation: запрос и ответ
  2. Контейнер DependencyInjection
  3. EventDispatcher: слабо связанные события
  4. Компонент Console: команды CLI
← Назад к PHP Academy