我正在努力通过类别名称从注入的已标记服务组中获取特定服务。
这是一个示例:我标记实现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']
Run Code Online (Sandbox Code Playgroud)
其他一些服务:
/**
* @var iterable
*/
private $drivers;
/**
* @param iterable $drivers
*/
public function __construct(iterable $drivers)
{
$this->drivers = $drivers;
}
public function getDriverByClassName(string $className): DriverInterface
{
????????
}
Run Code Online (Sandbox Code Playgroud)
因此,将实现的服务DriverInterface注入到$this->driversparam中作为可迭代的结果。我只能foreach通过它们,但是所有服务都将被实例化。
是否有其他方法可以将这些服务注入,以通过类名从它们获得特定服务而无需实例化其他服务?
我知道有可能将那些驱动程序公开并改为使用容器,但是我想避免以其他方式将容器注入服务中。
我有一个 Sumfony 4.3 命令,可以处理一些数据并循环通过多个“处理器”来进行处理。该代码使用工厂(自动装配),然后实例化该命令。
use App\Entity\ImportedFile;
use App\Service\Processor\Processor;
class Factory implements FactoryInterface
{
/** @var array */
private $processors;
/** @var TestClausesInterface */
private $testClauses;
private $em;
private $dataSetProvider;
private $ndviFromNasaService;
private $archivalHashService;
private $mailer;
private $projectDir;
public function __construct(
TestClausesInterface $testClauses,
ValidProcessorList $processors,
EntityManagerInterface $em,
DataSetProvider $dataSetProvider,
NDVIFromNasaService $ndviFromNasaService,
ArchivalHashService $archivalHashService,
\Swift_Mailer $mailer,
$projectDir)
{
$this->processors = $processors;
$this->testClauses = $testClauses;
$this->em = $em;
$this->dataSetProvider = $dataSetProvider;
$this->ndviFromNasaService = $ndviFromNasaService;
$this->archivalHashService = $archivalHashService;
$this->mailer = $mailer;
$this->projectDir = $projectDir; …Run Code Online (Sandbox Code Playgroud) php dependency-injection symfony symfony4 symfony-dependency-injection
我正在尝试实现 Symfonys 依赖注入容器。
我设置了 2 个容器,一个用于数据库,一个用于系统用户。
和我使用addArgument()的这两个App阶级和SystemUser阶级,推到App类SystemUser对象,并为SystemUser类Database对象。
索引.php:
require_once 'vendor/autoload.php';
use TestingDI\App;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
$containerBuilder = new ContainerBuilder();
$containerBuilder->register('database', '\TestingDI\Database');
$containerBuilder->register('system.user', '\TestingDI\SystemUser')
->addArgument(new Reference('database'));
$containerBuilder->register('app', '\TestingDI\App')
->addArgument(new Reference('system.user'));
$database = $containerBuilder->get('database');
$systemUser = $containerBuilder->get('system.user');
$app = $containerBuilder->get('app');
# Initialize App class
$app = new App();
Run Code Online (Sandbox Code Playgroud)
应用程序.php:
<?php
namespace TestingDI;
use TestingDI\SystemUser;
class App {
public $systemUser;
public function __construct(SystemUser $systemUser)
{
var_dump($systemUser);
}
} …Run Code Online (Sandbox Code Playgroud) php dependency-injection symfony symfony-dependency-injection