为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Slim 4 中注入多个 PDO 实例

如何在 Slim 4 中注入多个 PDO 实例

PHP
三国纷争 2022-08-19 10:19:11
我刚刚开始使用Slim 4(也是整个Slim的全新内容),在阅读并阅读了一些文章之后,我设法获得了一个具有PDO连接到DB的骨架应用程序设置。我现在正在寻找第二个PDO实例,以便可以根据请求使用第二个数据库,尽管我正在努力了解如何执行此操作。我目前的设置是:设置.php$settings['db'] = [    'driver' => 'mysql',    'host' => 'database',    'username' => 'root',    'database' => 'demo',    'password' => 'password',    'flags' => [        // Turn off persistent connections        PDO::ATTR_PERSISTENT => false,        // Enable exceptions        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,        // Emulate prepared statements        PDO::ATTR_EMULATE_PREPARES => true,        // Set default fetch mode to array        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,    ],];容器.phpreturn [    Configuration::class => function () {        return new Configuration(require __DIR__ . '/settings.php');    },    App::class => function (ContainerInterface $container) {        AppFactory::setContainer($container);        $app = AppFactory::create();        return $app;    },    PDO::class => function (ContainerInterface $container) {        $config = $container->get(Configuration::class);        $host = $config->getString('db.host');        $dbname =  $config->getString('db.database');        $username = $config->getString('db.username');        $password = $config->getString('db.password');        $dsn = "mysql:host=$host;dbname=$dbname;";        return new PDO($dsn, $username, $password);    },];存储库中的用法示例class UserReaderRepository{    /**     * @var PDO The database connection     */    private $connection;    /**     * Constructor.     *     * @param PDO $connection The database connection     */    public function __construct(PDO $connection)    {        $this->connection = $connection;    }
查看完整描述

1 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

经过一番深思熟虑,我想我已经解决了。


我使用容器创建了 PDO 实例


$container = $app->getContainer();


    $container->set('db', function(ContainerInterface $c) {

        $config = $c->get(Configuration::class);


        $host = $config->getString('db.host');

        $dbname =  $config->getString('db.database');

        $username = $config->getString('db.username');

        $password = $config->getString('db.password');

        $dsn = "mysql:host=$host;dbname=$dbname;";


        return new PDO($dsn, $username, $password);

    });


    $container->set('db_readonly', function(ContainerInterface $c) {

        $config = $c->get(Configuration::class);


        $host = $config->getString('db_readonly.host');

        $dbname =  $config->getString('db_readonly.database');

        $username = $config->getString('db_readonly.username');

        $password = $config->getString('db_readonly.password');

        $dsn = "mysql:host=$host;dbname=$dbname;";


        return new PDO($dsn, $username, $password);

    });

然后将存储库更改为使用构造函数中的 App,然后使用容器获取 PDO 实例


/**

     * @var PDO The database

     */

    private $db;


    /**

     * @var PDO The readonly database

     */

    private $readonly_db;


    /**

     * Constructor.

     *

     * @param App $app The database db

     */

    public function __construct(App $app)

    {

        $container = $app->getContainer();

        $this->db = $container->get('db');

        $this->readonly_db = $container->get('db_readonly');

    }

将此留在这里,以防其他人遇到问题,尽管有更好的方法可以做到这一点,或者我目前的方法可以改进,我将不胜感激的反馈


查看完整回答
反对 回复 2022-08-19
  • 1 回答
  • 0 关注
  • 94 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信