gpt4 book ai didi

php - 如何在 slim 4 中设置和注入(inject)多个 PDO 数据库连接?

转载 作者:行者123 更新时间:2023-12-04 20:19:10 25 4
gpt4 key购买 nike

我可以创建 PDO 的实例并成功注入(inject)。我定义了 PDO::class直接在构造函数中注入(inject) __construct(PDO $pdo) .我需要像 PDO1::class 这样的东西和 PDO2::class注入(inject)如下:__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;
}
}

我在 this 中看到过类似的东西文章:

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);
},

]);
};

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

最佳答案

您有多种选择:

  • 扩展 PDO
  • Autowiring 对象

  • 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. Autowiring 对象
    请参阅 Matthieu Napoli 的回答: https://stackoverflow.com/a/57758106/1461181

    关于php - 如何在 slim 4 中设置和注入(inject)多个 PDO 数据库连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57758020/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com