Почему контейнер 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.
Вкратце: целевой аудиторией интерфейса контейнера являются авторы библиотек или фреймворков, а не авторы конкретных приложений, где само приложение отвечает за заполнение контейнера. Вот почему нет методов установки.