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 Π±Π΅Π· Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΉ. ΠΡΠΈΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΊΠΎΠ³Π΄Π° Π΄Π°Π½Π½ΡΠ΅ ΠΏΡΠΈΡ ΠΎΠ΄ΡΡ ΠΈΠ· Π±Π΄ ΠΈ ΠΌΡ ΠΈΠΌ Π΄ΠΎΠ²Π΅ΡΡΠ΅ΠΌ (ΡΠ²Π΅ΡΠ΅Π½Π½Ρ, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΏΡΠΎΠ²Π°Π»ΠΈΠ΄ΠΈΡΠΎΠ²Π°Π½Ρ ΠΏΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΠΈΡΡΡ). Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ°Π·Π½ΠΈΡΠ° Π² ΡΠΊΠΎΡΠΎΡΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½Π°.
ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΠΈ "ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈ" Π±ΠΎΠ»ΡΡΠ΅, ΠΊΠΎΠ΄Π° ΠΏΠΈΡΠ°ΡΡ Π½ΡΠΆΠ½ΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠ΅Π½ΡΡΠ΅, Π²ΠΏΠΎΠ»Π½Π΅ ΠΊΠΎΠ½ΠΊΡΡΠ΅Π½ΡΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅ΡΡΠ΅Π΅ ΠΏΡΠ°Π²ΠΎ Π½Π° ΠΆΠΈΠ·Π½Ρ.