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

我刚刚开始使用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,

    ],

];

容器.php


return [

    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;

    }

三国纷争
浏览 95回答 1
1回答

慕工程0101907

经过一番深思熟虑,我想我已经解决了。我使用容器创建了 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');    }将此留在这里,以防其他人遇到问题,尽管有更好的方法可以做到这一点,或者我目前的方法可以改进,我将不胜感激的反馈
打开App,查看更多内容
随时随地看视频慕课网APP