Я изо всех сил пытаюсь получить конкретную услугу через имя класса из группы внедренных тегированных сервисов.
Вот пример: я помечаю все службы, которые реализуют DriverInterface
, как app.driver
и привязываю его к переменной $drivers
.
В какой-то другой службе мне нужно получить все те драйверы, которые помечены app.driver
, и создать и использовать только некоторые из них. Но какие драйверы понадобятся - динамические.
services.yml
_defaults:
autowire: true
autoconfigure: true
public: false
bind:
$drivers: [!tagged app.driver]
_instanceof:
DriverInterface:
tags: ['app.driver']
Другая услуга:
/**
* @var iterable
*/
private $drivers;
/**
* @param iterable $drivers
*/
public function __construct(iterable $drivers)
{
$this->drivers = $drivers;
}
public function getDriverByClassName(string $className): DriverInterface
{
????????
}
Таким образом, сервисы, реализующие DriverInterface
, вводятся в $this->drivers
param как повторяемый результат. Я могу только foreach
через них, но тогда будут созданы все службы.
Есть ли другой способ внедрить эти службы, чтобы получить от них конкретную службу через имя класса, не создавая экземпляры других?
Я знаю, что есть возможность сделать эти драйверы общедоступными и вместо этого использовать контейнер, но я бы хотел избежать внедрения контейнера в службы, если это возможно сделать другим способом.