如何在 Symfony 4 中不使用 DoctrineBundle 将 DBAL Doctrine 连接注册为服务

P. *_*ski 5 php doctrine symfony


我正在尝试仅将 Doctrine DBAL 连接组件注册为 Symfony4 中的服务。
我不需要 symfony 提供的完整 DoctrineBundle,而只需要提供基本数据库抽象级别的部分。
现在我一直在想办法如何将作曲家下载的原始库实现为服务。
这是 Connection 类的创建方式,如官方文档所示:

<?php
$config = new \Doctrine\DBAL\Configuration();
//..
$connectionParams = array(
    'dbname' => 'mydb',
    'user' => 'user',
    'password' => 'secret',
    'host' => 'localhost',
    'driver' => 'pdo_mysql',
);
$conn = \Doctrine\DBAL\DriverManager::getConnection($connectionParams, $config);
Run Code Online (Sandbox Code Playgroud)

如果可以的话,如何在service.yml配置中配置这种类型的服务?
如果不是,我该怎么办?

Cer*_*rad 6

您最好只使用主义包并从配置文件中删除 orm 部分。并不会真正增加太多开销,而且比自己做更容易。

话虽如此,这里是最小 dbal 设置的详细信息

composer create symfony/skeleton s40dbal
cd s40dbal
composer require server
composer require doctrine/dbal

# .env
DB_URL=mysql://user:password@localhost/dbname

# config/services.yaml
Doctrine\DBAL\Configuration:

Doctrine\DBAL\Connection:
    factory: 'Doctrine\DBAL\DriverManager::getConnection'
    arguments:
        -
            url : '%env(DB_URL)%'
            driverOptions: {20: false} # emulate prepared statements
        - '@Doctrine\DBAL\Configuration'

# DefaultController.php
use Doctrine\DBAL\Connection;
class DefaultController
{
    public function index(Connection $conn)
    {
        $stmt = $conn->prepare('SELECT id,name FROM users WHERE username = ?');
        $stmt->execute(['someuser']);
        $row = $stmt->fetch();
        var_dump($row);

        return new Response('dbal');
    }
}
Run Code Online (Sandbox Code Playgroud)

享受

  • 它是[PDO::ATTR_EMULATE_PREPARES](http://php.net/manual/en/pdo.constants.php),由于某种原因默认情况下是正确的。作为一个有用的副作用,整数列以整数形式返回,而不是字符串。 (2认同)