Имена зависимостей
Каждая зависимость в конфигурации 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 $locale | App\Example::class . '$locale' |
Logger $logger | App\Example::class . '$logger' |
string|Logger $mix | App\Example::class . '$mix' |
?Logger $optional | App\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) | Глобальный параметр |
| Переопределение для конкретного класса | Локальное имя |
| Примитивный параметр уникального сервиса | Локальное имя |
💡 По умолчанию используйте глобальные имена. Они делают конфигурацию предсказуемой — одна настройка работает для всех потребителей. Локальные имена — для точечного переопределения, когда это действительно нужно.