如何在slim 4中设置多个PDO数据库连接并在存储库中访问它们?

时间:2019-11-22 16:09:27

标签: pdo slim-4

我尝试通过2个PDO数据库连接设置SLIM4。
我无法从存储库访问db或db2。
我想我做错了事

我遵循了苗条的4骨架。
我在应用程序中创建了一个db.php文件,用于将db的定义添加到容器中
我将db.php包含在index.php中 我试图从存储库访问db或db2,但是它不起作用

这是我的文件:

app / db.php

    declare(strict_types=1);

    use PDO;
    use DI\ContainerBuilder;

    return function (ContainerBuilder $containerBuilder) {
        // Global Settings Object
        $containerBuilder->addDefinitions([
            'db' => function (ContainerInterface $c) {
                $settings = $c->get('settings');
                $dbSettings = $settings['db'];
                return new PDO('mysql:host=' . $dbSettings['host'] . ';dbname=' . $dbSettings['db'], $dbSettings['username'], $dbSettings['password'], $dbSettings['options']);
            },
            'db2' => function (ContainerInterface $c) {
                $settings = $c->get('settings');
                $dbSettings = $settings['db2'];
                return new PDO('mysql:host=' . $dbSettings['host'] . ';dbname=' . $dbSettings['db'], $dbSettings['username'], $dbSettings['password'], $dbSettings['options']);
            }
        ]);
    };

public / index.php

declare(strict_types=1);

use App\Application\Handlers\HttpErrorHandler;
use App\Application\Handlers\ShutdownHandler;
use App\Application\ResponseEmitter\ResponseEmitter;
use DI\ContainerBuilder;
use Slim\Factory\AppFactory;
use Slim\Factory\ServerRequestCreatorFactory;

require __DIR__ . '/../vendor/autoload.php';

// Instantiate PHP-DI ContainerBuilder
$containerBuilder = new ContainerBuilder();

if (false) { // Should be set to true in production
    $containerBuilder->enableCompilation(__DIR__ . '/../var/cache');
}

// Set up settings
$settings = require __DIR__ . '/../app/settings.php';
$settings($containerBuilder);

// Set up dependencies
$dependencies = require __DIR__ . '/../app/dependencies.php';
$dependencies($containerBuilder);

// Set up db, added by PF
$db = require __DIR__ . '/../app/db.php';
$db($containerBuilder);

// Set up repositories
$repositories = require __DIR__ . '/../app/repositories.php';
$repositories($containerBuilder);

// Build PHP-DI Container instance
$container = $containerBuilder->build();

// Instantiate the app
AppFactory::setContainer($container);
$app = AppFactory::create();
$callableResolver = $app->getCallableResolver();

// Register middleware
$middleware = require __DIR__ . '/../app/middleware.php';
$middleware($app);

// Register routes
$routes = require __DIR__ . '/../app/routes.php';
$routes($app);

/** @var bool $displayErrorDetails */
$displayErrorDetails = $container->get('settings')['displayErrorDetails'];

// Create Request object from globals
$serverRequestCreator = ServerRequestCreatorFactory::create();
$request = $serverRequestCreator->createServerRequestFromGlobals();

// Create Error Handler
$responseFactory = $app->getResponseFactory();
$errorHandler = new HttpErrorHandler($callableResolver, $responseFactory);

// Create Shutdown Handler
$shutdownHandler = new ShutdownHandler($request, $errorHandler, $displayErrorDetails);
register_shutdown_function($shutdownHandler);

// Add Routing Middleware
$app->addRoutingMiddleware();

// Add Error Middleware
$errorMiddleware = $app->addErrorMiddleware($displayErrorDetails, false, false);
$errorMiddleware->setDefaultErrorHandler($errorHandler);

// Run App & Emit Response
$response = $app->handle($request);
$responseEmitter = new ResponseEmitter();
$responseEmitter->emit($response);

src / Domain / ObContact / ObContactRepository.php

declare(strict_types=1);

namespace App\Domain\ObContact;

use PDO;

class ObContactRepository
{
    /**
     * @var PDO The database db
     */
    private $db;
    private $db2;

    /**
     * Constructor.
     *
     * @param PDO $db The database db
     */
    public function __construct(PDO $db, PDO $db2)
    {
        $this->db = $db;
        $this->db2 = $db2;
    }

    public function findByEmail(string $email)
    {
        if (empty($email))
            return false;

        return $this->db
            ->query('SELECT * FROM ob_contact WHERE email=:email')
            ->execute([':email' => $email])
            ->fetch();
    }
}

1 个答案:

答案 0 :(得分:-1)

您安装了PDO吗?

$ composer require faapz/pdo 

来源: https://github.com/FaaPz/PDO