Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Имена зависимостей

Каждая зависимость в конфигурации DI идентифицируется по уникальному имени. Знание правил формирования этих имён — ключ к правильной настройке params и alias.

Формирование имени

Имя зависимости строится из сигнатуры конструктора потребляющего класса. Разберём основные случаи на примере:

<?php
namespace App;

class Example
{
    public function __construct(
        string $locale,        // примитивный тип
        Logger $logger,        // тип-класс
        string|Logger $mix,    // объединённый тип
        ?Logger $optional,     // nullable
        Logger ...$logs,       // вариативный аргумент
    ) {}
}

Для каждого аргумента генерируются два имени:

Глобальное имя

Используется для регистрации значения во всём проекте.

АргументГлобальное имя
string $locale"locale"
Logger $logger"App\Logger"
string|Logger $mix"string|App\Logger"
?Logger $optional"?App\Logger"
Logger ...$logs"...App\Logger"

Правило: тип аргумента, взятый как есть — с полным namespace, модификаторами ? и .... Для скалярных типов (string, int, bool, float, array, object, callable, iterable) — имя равно имени типа в кавычках.

Локальное имя

Используется для точечной настройки одного конкретного аргумента.

АргументЛокальное имя
string $localeApp\Example::class . '$locale'
Logger $loggerApp\Example::class . '$logger'
string|Logger $mixApp\Example::class . '$mix'
?Logger $optionalApp\Example::class . '$optional'
Logger ...$logs'...' . App\Example::class . '$logs'

Правило: ClassName::class . '$argName'. Для вариативных аргументов — с префиксом '...' ..

Глобальное или локальное?

Глобальное имя

Применяется ко всем потребителям сразу. Удобно для привязки интерфейсов и общих параметров:

'params' => [
    'locale' => 'ru_RU',  // все locale-параметры во всём проекте
],
'alias' => [
    Logger::class => Monolog\Logger::class,  // все, кто просит Logger, получат Monolog
],

Локальное имя

Применяется точечно, только к одному аргументу одного класса. Удобно для переопределения:

'params' => [
    App\Example::class . '$locale' => 'en_GB',  // только для Example::$locale
],

Что выбрать?

СитуацияРекомендуемый подход
Маппинг интерфейса → реализацияГлобальный алиас
Общий параметр (locale, версия API)Глобальный параметр
Переопределение для конкретного классаЛокальное имя
Примитивный параметр уникального сервисаЛокальное имя

💡 По умолчанию используйте глобальные имена. Они делают конфигурацию предсказуемой — одна настройка работает для всех потребителей. Локальные имена — для точечного переопределения, когда это действительно нужно.