dvelum/dr

Data Record


Keywords
php
License
MIT

Documentation

PHP Version Total Downloads Build and Test Codacy Badge Codacy Badge

Data Record - Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ для создания ΠΈ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ структур Π΄Π°Π½Π½Ρ‹Ρ…

ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ Π²Π°Π»ΠΈΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ структуры Π΄Π°Π½Π½Ρ‹Ρ…, Π±Π΅Π· привязки ΠΊ Π‘Π” / ActiveRecord / ORM.

МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π·Π°ΠΌΠ΅Π½Ρƒ DTO.

МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π·Π°ΠΌΠ΅Π½Ρƒ Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€Π° Active Record ΠΈΠ»ΠΈ ORM Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…, Π³Π΄Π΅ Π½Π΅Ρ‚ ТСлания ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ массивныС ORM.

ΠšΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ структуру ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² массив, Π΄Π°Π»Π΅Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² Π‘Π”.

ΠšΡ€ΠΎΠΌΠ΅ стандартных Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€ΠΎΠ², позволяСт Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свои.

ДокумСнтация

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π°

  • Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΠΈΠ»ΠΈΠ΅ классов ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚ΠΈΠΏ, Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΈΡ… полями, Π³Π΅Ρ‚Ρ‚Π΅Ρ€Π°ΠΌΠΈ ΠΈ сСттСрами
  • экономит врСмя Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ, количСство ΠΊΠΎΠ΄Π° Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅
  • стандартныС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΠΎΠ»Π΅ΠΉ Ρ‚ΠΈΠΏΠ° minVal, maxVal, maxLength, defaultValue, isNullable Π΄Π΅Π»Π°ΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΎΠΉ настройкой Π² Ρ„Π°ΠΉΠ»Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ
  • Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ всСли Π»ΠΈ required поля Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Ρ‹
  • Π΅ΡΡ‚ΡŒ слСТСниС Π·Π° состояниСм измСнСния (ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список ΠΏΠΎΠ»Π΅ΠΉ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ измСнились)
  • ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ собствСнныС (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 - Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Record ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ setRawData

ВрСмя, c RAM, mb
DTO 0.025 13.177
DR 0.146 2.016
DR raw 0.036 2.016

Data Record потрСбляСт Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ мСньшС (6.5 Ρ€Π°Π·) ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти Π·Π° счСт ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ, Π½ΠΎ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния СстСствСнно уступаСт Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ иструмСнтам (5.5 Ρ€Π°Π·), Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΉ большС ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΎΠ½ΠΈ Π² ΠΊΠΎΠ΄Π΅.

Для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ заполнСния Data Record Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ setRawData, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ заполняСт Record Π±Π΅Π· Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΉ. Π­Ρ‚ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠ³Π΄Π° Π΄Π°Π½Π½Ρ‹Π΅ приходят ΠΈΠ· Π±Π΄ ΠΈ ΠΌΡ‹ ΠΈΠΌ довСряСм (ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄ записью). Π’ этом случаС Ρ€Π°Π·Π½ΠΈΡ†Π° Π² скорости выполнСния минимальна.

Π’Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ "ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ" большС, ΠΊΠΎΠ΄Π° ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ мСньшС, Π²ΠΏΠΎΠ»Π½Π΅ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π΅ ΠΏΡ€Π°Π²ΠΎ Π½Π° Тизнь.