如何在Slim 4中设置和注入多个PDO数据库连接?

塞缪尔·格弗勒

我可以创建一个实例PDO并将其成功注入。PDO::class直接定义了,并将其注入到构造函数中__construct(PDO $pdo)我需要类似的东西,PDO1::class并按PDO2::class如下方式注入它:__construct(PDO1 $pdo1, PDO2 $pdo2)但这显然行不通。只有一个PDO类,我需要做的是使用不同数据库凭据的2个实例。
最好的方法是什么?

我像这样通过PDO设置了一个数据库定义,它的工作原理是:

文件: dependencies.php

use DI\ContainerBuilder;
use Psr\Container\ContainerInterface;

return function (ContainerBuilder $containerBuilder) {
    $containerBuilder->addDefinitions([
        PDO::class => function (ContainerInterface $c) {
            $dbSettings = $c->get('settings')['db1'];
            $dsn = 'mysql:host=' . $dbSettings['host'] . ';dbname=' . $dbSettings['dbname'];
            $options = [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES => false,
            ];
            return new PDO($dsn, $dbSettings['user'], $dbSettings['pass'], $options);
        },
    ]);
};

文件: index.php

...
// Set up dependencies
$dependencies = require __DIR__ . '/../app/dependencies.php';
$dependencies($containerBuilder);
// Build PHP-DI Container instance
$container = $containerBuilder->build();
// Set container to create App with on AppFactory
AppFactory::setContainer($container);
// Instantiate the app
$app = AppFactory::create();
...

文件 SomeRepository.php

use PDO;

class SomeRepository{

    protected $pdo;

    public function __construct(PDO $pdo) {
        $this->pdo = $pdo;
    }
}

我见过这样的事情在这个文章:

return function (ContainerBuilder $containerBuilder) {
    $containerBuilder->addDefinitions([
        'db1' => function (ContainerInterface $c) {
            $db1Settings = $c->get('settings')['db1'];
            $dsn = 'mysql:host=' . $db1Settings['host'] . ';dbname=' . $db1Settings['dbname'];
            $options = [ ... ];
            return new PDO($dsn, $db1Settings['user'], $db1Settings['pass'],$options);
        },
        'db2' => function (ContainerInterface $c) {
            $db2Settings = $c->get('settings')['db2'];
            $dsn = 'mysql:host=' . $db2Settings['host'] . ';dbname=' . $db2Settings['dbname'];
            $options = [ ... ];
            return new PDO($dsn, $db2Settings['user'], $db2Settings['pass'],$options);
        },

    ]);
};

但这是最好的方法吗?以及如何在无需注入整个容器的情况下访问存储库类中的连接?

忠诚

您有多种选择:

  1. 扩展PDO
  2. 自动连线对象

1.扩展PDO

use PDO;

class PDO2 extends PDO
{
    // must be empty
}

容器定义:

use PDO2;

// ...

return [
    PDO::class => function (ContainerInterface $container) {
        return new PDO(...);
    },

    PDO2::class => function (ContainerInterface $container) {
        return new PDO2(...);
    },
];

用法

use PDO;
use PDO2;

class MyRepository
{
    private $pdo;

    private $pdo2;
    
    public function __construct(PDO $pdo, PDO2 $pdo2)
    {
        $this->pdo = $pdo;
        $this->pdo2 = $pdo2;
    }
}

2.自动接线对象

请参阅Matthieu Napoli的答案:https : //stackoverflow.com/a/57758106/1461181

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在JPA中连接多个数据库?

如何在Java中为不同的数据库创建多个数据库连接

如何在Slim中访问POST请求的JSON请求正文?

如何在中间件Slim PHP框架中响应

如何在SLIM中呈现HTML编码的文本

如何在Slim 2中对博客文章进行分页?

如何在Slim应用程序中管理错误?

ruby on rails slim如何在select中处理值

如何在PHP中为数据库连接mysqli编写依赖项注入?

如何在Visual Studio中设置SQL数据库项目中的数据库连接字符串?

如何在 Slim 4 框架中将服务注入 Behat 功能上下文

如何在Slim v3中将Slim v2挂钩实现为中间件

如何在Django中自定义数据库连接设置的时区?

Yii 2-如何在多数据库查询中设置连接

如何在SSMS的“连接到数据库”中取消设置默认值

Laravel - 如何在数据库连接字符串中设置附加参数?

golang:如何在Go中连接到多个MySQL数据库?

如何在ssrs报表中从Oracle数据库连接和检索数据

如何在Elastic beantalk中安装pdo_sqlsrv驱动程序以连接SQL Server数据库实例

如何在 Slim 中的 <p> 中插入 text 和 link_to

如何在 JDBCTemplate spring 4 中打开数据库连接

如何在laravel 5.7中全局断开和重新连接数据库

如何在ASP.NET MVC和Azure中连接到数据库?

SQL 如何在新数据库中填充空表并使连接和外键对齐?

当我的数据库是 MySQL 时,如何在我的连接字符串中设置 connection_limit 和 pool_timeout?

如何在ddev中连接到数据库?

如何在openshift中连接到数据库?

如何在docker中连接postgres数据库

如何在Julia中连接到MySQL数据库