数据记录

1.3.0 2021-02-27 22:14 UTC

This package is auto-updated.

Last update: 2024-08-28 06:06:15 UTC


README

PHP Version Total Downloads Build and Test Codacy Badge Codacy Badge

数据记录 - 用于创建和验证数据结构的工具

允许创建和验证数据结构,无需依赖数据库 / 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 多,需要编写的代码少得多,这是一项具有生存权的竞争性解决方案。