dvelum / dr
Requires
- php: ~7.4
Requires (Dev)
- codacy/coverage: dev-master
- phpstan/phpstan: ^0.12
- phpunit/phpunit: ^9
README
数据记录 - 用于创建和验证数据结构的工具
允许创建和验证数据结构,无需依赖数据库 / ActiveRecord / ORM。
可以用作 DTO 的替代品。
可以用作在不想使用大量 ORM 的项目中替代 Active Record 或 ORM 验证器。
最终结构可以导出为数组,然后保存到数据库中。
除了标准的数据类型和验证器,还可以注册自己的。
优点
- 无需为每种类型创建大量类,填充字段、获取器和设置器
- 节省开发时间,减少运行时代码量
- 在配置文件中通过单个设置即可执行标准字段类型检查,例如 minVal、maxVal、maxLength、defaultValue、isNullable
- 可以检查是否所有必需字段都已填写
- 可以跟踪状态变化(获取已更改字段列表)
- 可以创建自定义(custom)数据类型(非常简单)
- 使用懒加载,节省内存
- 相对于 DTO,内存消耗显著减少
- 自动类型转换,例如 DateTime
$record->set('dateTimeField', '2021-01-01 00:00:00'); /** * @var \DateTime $result */ $result = $record->get('dateTimeField');
安装
composer require dvelum/dr
简化示例
配置文件 Records 注册 registry.php
<?php use Dvelum\DR\Type\StringType; use Dvelum\DR\Type\DateTimeType; use Dvelum\DR\Record\DefaultValue\CurrentDateTimeString; $registry = [ 'records'=> [ 'ClientData' => [ 'fields' => [ 'firstName' => [ 'type' => 'string', // можно StringType::class 'minLength' => 2, 'required' => true, ], 'age' => [ 'type' => 'int', 'minValue' => 18, 'default' => 18, ], 'date' => [ 'type' => DateTimeType::class, 'minValue' => '2021-01-01', 'defaultValueAdapter' => CurrentDateTimeString::class ] ] ] ] ];
使用
<?php use Dvelum\DR\Factory; // получаем данные POST из запроса $params = $psr7Request->getParsedBody(); // получаем настройки реестра $registry = include 'registry.php'; // создаем фабрику DR $factory = new Factory($registry); //=== Пример 1 ================================ $record = $factory->create('ClientData'); try{ $record->setData($params); }catch(\InvalidArgumentException $e){ // переданы невалидные данные } // можно проверить все ли обязательные поля переданы if(!$record->validateRequired()->isSuccess()){ // не все обязательные поля заданы } //=== Пример 2 ================================ // получаем id записи из параметров запроса $id = $psr7Request->getQueryParams()['id']; /** * Загружаем данные из нашего хранилища * @var array $clientData */ $clientData = $someStorage->load($id); $record = $factory->create('ClientData'); // помещаем данные из хранилища в структуру $record->setData($clientData); // помечаем изменения как принятые $record->commitChanges(); try{ // сетим данные из запроса $record->setData($params); }catch(\InvalidArgumentException $e){ // переданы невалидные данные } // Для удобства экспорта данных в хранилище, например в БД, есть подготовленный класс экспорта, // который конвертирует поля в нужный вид (например json поле в строку, DateTime в строку формата 'Y-m-d H:i:s') $export = new \Dvelum\DR\Export\Database(); // получить все данные $data = $export->exportRecord($record); // или получить только обновления $data = $export->exportUpdates($record); // Export можно получить и из объекта $factory->getExport('ExportAlias'), тогда его нужно будет зарегистрировать при создании $factory // и получить командой: /** * @var ExportInterface $export */ $export = $factory->getExport('Database');
IDE 中没有字段高亮显示可以通过 UI 包 dvelum\dr-ui 来弥补
实验性包,允许查看您的数据结构。
目前只提供查看功能,未来可能会添加编辑功能。
在本地主机 Linux/macOS 上使用一个命令启动
性能
DataRecord 与 DTO 的比较,测试填充 50,000 个对象。
PHP 7.4,xdebug 关闭,cli opcache 启用。
php test/tests/performance/create.php - 创建随机数据集
php test/tests/performance/dto.php - 填充 DTO
php test/tests/performance/record.php - 填充 Record
php test/tests/performance/record.php -r 1 - 使用 setRawData 填充 Record
DataRecord 由于优化,内存消耗显著减少(6.5 倍),但执行时间自然低于原生工具(5.5 倍),因为验证更多且在代码中执行。
为了提高填充性能,DataRecord 有一个 setRawData 方法,该方法在不进行验证的情况下填充 Record。当数据来自数据库并且我们信任它们(确信它们在写入前已通过验证)时,可以使用此方法。在这种情况下,执行速度差异最小。
内置验证比 DTO 多,需要编写的代码少得多,这是一项具有生存权的竞争性解决方案。

