Symfony 将服务容器注入到学说连接包装器中

问题描述 投票:0回答:2

我尝试将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')
php symfony dependency-injection doctrine-orm
2个回答
3
投票

您可以通过添加

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')
           ]);
    }

}

但请注意,正如其他用户所提到的,这不是一个很好的做法。你应该准确地注入你需要的东西,而不是容器服务。


0
投票

不完全是注入容器(不好的做法),但假设我们想要注入任何服务。

构造函数注入不适合我,它需要大量其他参数,这些参数应该来自配置:

 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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.