squirrelphp/queries-bundle

Squirrelphp/queries 的 Symfony 集成 - 自动组装装饰的连接。

v0.14.1 2023-12-01 08:40 UTC

This package is auto-updated.

Last update: 2024-08-30 01:26:11 UTC


README

Build Status Test Coverage PHPStan Packagist Version PHP Version Software License

通过服务标签和包配置将 squirrelphp/queries 集成到 Symfony 中。

安装

composer require squirrelphp/queries-bundle

配置

通过将 Squirrel\QueriesBundle\SquirrelQueriesBundle 添加到包列表中(通常在 config/bundles.php)来在您的项目中启用此包。

为您的每个 Doctrine DBAL 连接创建一个 Symfony 服务,并将其标记为 squirrel.connection,例如:

services:
    database_connection:
        class: Doctrine\DBAL\Connection
        factory: Doctrine\DBAL\DriverManager::getConnection
        arguments:
            $params:
                driver:   pdo_mysql
                host:     "%database_host%"
                port:     "%database_port%"
                dbname:   "%database_name%"
                user:     "%database_user%"
                password: "%database_password%"
                charset:  UTF8
        tags:
            - { name: squirrel.connection, connectionName: somename, connectionType: mysql, isDefault: true }

您可以使用任何 DBAL 连接设置,服务名称(在这种情况下为 database_connection)无关紧要。对于标记,只需确保:

  • 使用三种受支持的数据库类型之一作为 connectionTypemysql 用于 MySQL/MariaDB,pgsql 用于 PostgreSQL,sqlite 用于 SQLite
  • 为每个标记条目设置一个唯一的 connectionName

如果将 isDefault 设置为 true,则该连接将注册为 Squirrel\Queries\DBInterface,然后您可以使用它作为服务中的类型提示。只有一个连接可以是默认的!

如果您有多个连接并且需要在服务定义中引用它们,可以通过 connectionName 专门注入它们 - 只需在前面加上 squirrel.connection. 以获取正确的注册服务名称。因此,对于 mysql_remote 连接名称,Symfony 中的服务将称为 squirrel.connection.mysql_remote

传递给 Doctrine 的 PDO 额外配置

  • 对于所有连接,PDO::ATTR_EMULATE_PREPARES 被设置为 false,因此启用了真正的查询和值分离,而不是通过 PDO 模拟它。在这方面,您不应注意到任何差异,甚至在性能方面:这已经过测试,当脚本和数据库在同一网络中运行时,没有可测量的差异。如果脚本和数据库之间有一定的距离,才可能出现任何可能的影响。
  • 对于 MySQL,PDO::MYSQL_ATTR_FOUND_ROWS 被设置为 true,这意味着报告给 UPDATE 查询的“受影响行”是数据库中的找到的行,即使执行 UPDATE 没有更改。默认情况下,MySQL 会得到“更改”的行,这是其他数据库没有甚至支持的行为,因此这不是一个好的依赖行为。
  • 对于 MySQL,PDO::MYSQL_ATTR_MULTI_STATEMENTS 被设置为 false,这意味着一个查询中不可能有多个语句。当经常使用 Squirrel Queries 时,这应该不会产生任何影响(因为库一次只执行一个查询),但如果您使用 Doctrine 连接进行一些自定义操作,这确保您不会犯错误,因为过去多个语句每个查询都是安全漏洞的来源,并且几乎没有现实世界的相关性。

添加层

默认情况下,此包创建具有实现层和错误处理层的 DBInterface 服务(有关详细信息,请参阅 squirrelphp/queries)。

如果您想为 DBInterface 添加额外的层进行装饰,为每个额外的层创建一个服务并标记为 squirrel.layer。确保服务实现 Squirrel\Queries\DBRawInterface 并在服务中添加 Squirrel\Queries\DBPassToLowerLayerTrait 特性。为标记定义一个 priority 并将其设置为负数,如果您想将其注入到实现和错误处理器之间,或者将其设置为正数,如果它应该在错误处理器之上。

示例:在错误处理器自动重试查询/事务之前,记录器记录死锁/连接超时服务的定义

services:
    Squirrel\QueriesBundle\Examples\SQLLogTemporaryFailuresListener:
        tags:
            - { name: squirrel.layer, priority: -250 }

因为优先级低于零,它位于错误处理器的下一层。您可以在示例目录中找到可能的实现。

Symfony分析器

使用Symfony分析器时,此库提供与DoctrineBundle类似的集成功能,因此您可以检查发送到数据库的查询以及它们所花费的时间。