tanoconsulting / datavalidatorbundle
一个用于验证存储在数据库和文件系统中的数据工具
Requires
- php: ^7.3|^8.0
- ext-json: *
- doctrine/dbal: ^2.11|^3.0
- symfony/console: ^5.0.0
- symfony/dependency-injection: ^5.0.0
- symfony/event-dispatcher: ^5.0.0
- symfony/finder: ^5.0.0
- symfony/yaml: ^5.0.0
Requires (Dev)
- phpunit/phpunit: ^8.5.12
- symfony/validator: ^5.0.0
Suggests
- ext-pcntl: To allow gracefully exiting long running validation commands
This package is auto-updated.
Last update: 2024-09-10 22:39:46 UTC
README
目标
允许检查数据库中数据的完整性,超出数据库模式定义所强制的内容。
允许检查一组文件的完整性(WIP)。
用例
有许多场景,在数据库模式中配置的约束不足以强制数据完整性,例如:
- 使用的数据库引擎不支持高级/复杂的数据验证约束
- 使用的数据库引擎支持高级数据验证约束,但未使用
- 使用数据库引擎难以表达的数据完整性约束过于复杂
- 在大量导入操作期间,禁用了本地约束以提高速度
- 在多个应用程序写入数据库的情况下,在应用程序代码中实现约束
在所有这些情况下,一个单独的工具可以验证数据库中存储的数据是否符合一系列规则,这将非常有用。
要求
- php 7.3 或更高版本
- 由 Doctrine DBAL 支持的数据库(2.11 或 3.0 或更高版本)
- Symfony 组件:请参阅
composer.json
快速开始
-
可以在 yaml 或 json 文件中定义约束集。以下示例使用 yaml 显示支持的语法
constraints: - ForeignKey: child: ezapprove_items: collaboration_id parent: ezcollab_item: id - ForeignKey: child: ezbinaryfile: [contentobject_attribute_id, version] parent: ezcontentobject_attribute: [id, version] - ForeignKey: child: ezcontentobject: id parent: ezcontentobject_version: contentobject_id except: 'ezcontentobject.status = 1 AND ezcontentobject_version.status = 1' - Query: name: classes_with_same_identifier sql: 'SELECT identifier, COUNT(*) AS identical_identifiers FROM ezcontentclass WHERE version = 0 GROUP BY identifier HAVING COUNT(*) > 1' # skip the validation of this constraint in a silent manner if the table is missing by using the line below: requires: {table: ezcontentclass}
-
运行验证命令
php bin/console datavalidator:validate:database --config-file=<my_schema_constraints.yaml>
这假设您的应用程序已设置一个名为 doctrine 的数据库连接配置。如果不是这种情况,您可以运行
php bin/console datavalidator:validate:database --config-file=<my_schema_constraints.yaml> --database=<mysql://user:pwd@localhost/mydb>
如果您想列出验证约束而不验证它们,请运行
php bin/console datavalidator:validate:database --config-file=<my_schema_constraints.yaml> --dry-run
默认情况下,结果显示违反每个约束的数据库行数。要查看这些行的数据,请使用
php bin/console datavalidator:validate:database --config-file=<my_schema_constraints.yaml> --display-data
当前支持的约束
- 外键定义
- 自定义 SQL 查询
请参阅 doc/samples 文件夹中的知名应用程序数据库模式约束示例。
更高级的使用
在代码中定义验证约束
您可以通过设置配置参数 data_validator.constraints.database
的值或使用 data_validator.constraint_provider.database
标签来标记服务,而不是在命令行上使用专用配置文件来配置验证约束。那些服务必须实现一个公开方法 getConstraintDefinitions()
,它返回所有相关的约束定义
- 通过设置配置参数
data_validator.constraints.database
- 通过标记服务为
data_validator.constraint_provider.database
创建您自己的约束类型
WIP
故障排除
-
使用
-v
命令行选项查看执行详情 -
如果约束验证的执行时间过长,您可以使用 CTRL-C 在中途停止执行:脚本将以优雅的方式退出,并打印出在该点之前找到的任何违规行为
-
为了避免在“调试模式”下运行 Symfony 时由于大查询而造成的内存使用过多,请将
--no-debug
选项添加到您的命令中。如果可能,请使用非调试的 Symfony 环境。 -
如果您仍然收到“允许的内存大小”致命错误,请使用
php -d memory_limit=-1
运行命令。
常见问题解答
- 问:我可以在控制器或事件中运行验证而不是 cli 命令吗?答:技术上可以,但通常不推荐,因为用于验证整个数据集的数据库查询可能需要很长时间才能执行。
感谢
基于 Symfony/Validator 组件的代码;感谢所有开发者!