Почему контейнер PHP PSR-11 не предоставляет методы для установки зависимостей?

Если я разрабатываю библиотеку, которая хочет использовать контейнер зависимостей, я думаю, что контейнер implementation (php-di, symfony/dependency-injection и т. д.) должен быть определен пользователем библиотеки, который, в конечном итоге, передает его мне, например, в конструкторе моих классов, следующим образом:

public function __construct(string param, ?ContainerInterface $container = null)
{
    $this->param = $param;
    $this->container = $container;
}

Теперь, если я хочу добавить запись в контейнер, как я могу сделать это способом, совместимым с различными реализациями контейнера PSR-11, если в спецификации не предусмотрен общий метод? С участиемphp-di Я бы просто позвонил set метод:

public function __construct(string param, ?ContainerInterface $container = null)
{
    $this->param = $param;
    $this->container = $container; // I know it's a php-di container
    $myDependency = Factory::buildMyDependency(); // dependency not instantiable through "new" keyword
    $this->container->set(MyDependency::class, $myDependency)
}

Сделав шаг назад, каким должен быть способ совместного использования контейнера между множеством библиотек, которые живут вместе? Я что-то упускаю? Я не думаю, что у каждой библиотеки есть своя реализация контейнера.

Заранее спасибо.

1 ответ

Я наткнулся на тот же вопрос и был также удивлен, что метод set не включен.

Причина этого объясняется в этом документе здесь: https://www.php-fig.org/psr/psr-11/meta/#31-goals.

Вкратце: целевой аудиторией интерфейса контейнера являются авторы библиотек или фреймворков, а не авторы конкретных приложений, где само приложение отвечает за заполнение контейнера. Вот почему нет методов установки.

Другие вопросы по тегам