我尝试将symfony服务容器注入到dcotrine动态连接wrapper_class中
use Doctrine\DBAL\Connection;
class DynamicConnection extends Connection
{
public $container;
/**
* @required
* @param $container
*/
public function setContainer(ContainerInterface $container)
{
$this->container = $container;
}
}
我也尝试用service.yaml注入它
App\Service\Database\DynamicConnection:
calls:
- [setContainer, ['@service_container']]
但这也行不通。我如何在这里注入服务容器? 我这里的目标是获取服务容器的变量:
$this->container->get('my.string.variable')
您可以通过添加
CompilerPass
来完成此操作。对于简单的 CompilerPass
,您可以通过实现 Kernel
:直接将其添加到应用程序
CompilerPassInterface
类中
class Kernel extends BaseKernel implements CompilerPassInterface
{
use MicroKernelTrait;
...
public function process(ContainerBuilder $container)
{
$container
->getDefinition('doctrine.dbal.default_connection')
->addMethodCall('setContainer', [
new Reference('service_container')
]);
}
}
但请注意,正如其他用户所提到的,这不是一个很好的做法。你应该准确地注入你需要的东西,而不是容器服务。
不完全是注入容器(不好的做法),但假设我们想要注入任何服务。
构造函数注入不适合我,它需要大量其他参数,这些参数应该来自配置:
public function __construct(
#[SensitiveParameter]
array $params,
protected Driver $driver,
?Configuration $config = null,
)
Setter 注入对我不起作用(我假设包装类没有经历依赖注入过程,只是将该类传递给连接初始化?)。
我不想为此构建额外的编译器通道。
由于构造函数注入、setter 注入和编译器传递都不适合我,所以我只使用了适配器模式。我创建了一个易于构造函数注入的新服务,它调用 DBAL 连接方法。
<?php declare(strict_types=1);
namespace App\Infrastructure\Database;
use App\Business\Security\Authenticator;
use Doctrine\DBAL\Connection as DoctrineDBALConnection;
use Doctrine\DBAL\Query\QueryBuilder;
final class Connection
{
private DoctrineDBALConnection $connection;
private Authenticator $authenticator;
public function __construct(DoctrineDBALConnection $connection, Authenticator $authenticator)
{
$this->connection = $connection;
$this->authenticator = $authenticator;
}
public function createQueryBuilder(): QueryBuilder
{
// to your extra stuff here
return $this->connection->createQueryBuilder();
}
}