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

Преобразование аргументов в имена зависимостей

Библиотека анализирует типы аргументов конструктора, чтобы определить имя зависимости для каждого аргумента. Вот как это работает для разных типов данных.

🎯 Основные правила

Тип аргументаИмя зависимостиПример
Builtin-тип (string, int, bool и др.)Имя аргумента без $$usernameusername
Класс/ИнтерфейсПолное имя класса с namespaceA $arg1App\A
Nullable builtinИмя аргумента без $?string $usernameusername
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 $usernameusername
  • Класс: ?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()]

Понимание правил преобразования аргументов помогает правильно настроить зависимости и избежать ошибок при компиляции контейнера.