Преобразование аргументов в имена зависимостей
Библиотека анализирует типы аргументов конструктора, чтобы определить имя зависимости для каждого аргумента. Вот как это работает для разных типов данных.
🎯 Основные правила
| Тип аргумента | Имя зависимости | Пример |
|---|---|---|
| Builtin-тип (string, int, bool и др.) | Имя аргумента без $ | $username → username |
| Класс/Интерфейс | Полное имя класса с namespace | A $arg1 → App\A |
| Nullable builtin | Имя аргумента без $ | ?string $username → username |
| Nullable класс | Имя класса с ? в начале | ?A $arg1 → ?App\A |
| Variadic builtin | ... + имя аргумента | int ...$numbers → ...numbers |
| Variadic класс | ... + имя класса | A ...$items → ...App\A |
🔍 Подробное объяснение
1. Builtin-типы (isBuiltin() = true)
class Example {
public function __construct(private string $username) {}
}
→ Имя зависимости: username
2. Классы и интерфейсы (isBuiltin() = false)
namespace App;
class Example {
public function __construct(private A $arg1) {}
}
class A {}
→ Имя зависимости: App\A
3. Nullable-типы
- Builtin:
?string $username→username - Класс:
?A $arg1→?App\A
4. Variadic-аргументы (…)
- Builtin:
int ...$numbers→...numbers - Класс:
?A ...$items→...?App\A
Важно: Для variadic-аргументов необходимо передавать массив, где каждый элемент соответствует указанному типу.
⚠️ Union|Intersection|DNF types
class Example {
public function __construct(
string|int $arg1,
int|string $arg2,
A&B $arg2,
(A&B)|string $arg3,
) {}
}
→ Зависимость считается non-builtin. В качестве имени используется тип аргумента.
string|intиint|string→ приводятся к одному имени, имя формируется по внутренним правилам PHP **(нормализация порядка типов).- Если возникает ошибка, смотрите в исключении точное имя, которое пытается найти библиотека
- Для таких аргументов
Значения по умолчанию игнорируются
class Example {
public function __construct(string $username = 'default') {}
}
→ Значение ‘default’ игнорируется. Вы должны явно указать зависимость через params или alias.
🧪 Примеры для разных случаев
class UserService {
public function __construct(
private string $dsn, // → 'dsn'
private Logger $logger, // → 'Logger'
private ?Config $config = null // → '?Config'
) {}
}
class EventDispatcher {
public function __construct(
EventListener ...$listeners // → '...EventListener'
) {}
}
// В params нужно передать массив:
// '...EventListener' => [new Listener1(), new Listener2()]
Понимание правил преобразования аргументов помогает правильно настроить зависимости и избежать ошибок при компиляции контейнера.