squirrelphp / queries-bundle
Squirrelphp/queries 的 Symfony 集成 - 自动组装装饰的连接。
Requires
- php: >=8.0
- ext-pdo: *
- jdorn/sql-formatter: 1.2.17
- squirrelphp/queries: ^1.0
- symfony/dependency-injection: ^5.0|^6.0|^7.0
- symfony/http-kernel: ^5.0|^6.0|^7.0
- symfony/var-dumper: ^5.0|^6.0|^7.0
Requires (Dev)
- bamarni/composer-bin-plugin: ^1.8
- captainhook/plugin-composer: ^5.0
- phpunit/phpunit: ^10.0
- twig/twig: ^3.0
Suggests
- squirrelphp/entities-bundle: Automatic integration of squirrelphp/entities in Symfony
README
通过服务标签和包配置将 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
)无关紧要。对于标记,只需确保:
- 使用三种受支持的数据库类型之一作为
connectionType
:mysql
用于 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类似的集成功能,因此您可以检查发送到数据库的查询以及它们所花费的时间。