2017 © Pedro PelΓ‘ez
 

library php-data-transformer2

Convert model to dto, convert dto to model

image

alexpts/php-data-transformer2

Convert model to dto, convert dto to model

  • Wednesday, December 27, 2017
  • by alexpts
  • Repository
  • 2 Watchers
  • 2 Stars
  • 78 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 0 Forks
  • 1 Open issues
  • 6 Versions
  • 1 % Grown

The README.md

php-data-transformer2

phpunit codecov, (*1)

ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ это ΠΏΠΎ Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π»Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ схСмС Π² ΠΎΠ±Π΅ стороны. НапримСр ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Model для записи Π² Π‘Π”. Π›ΠΈΠ±ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ/Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Model Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ· Π‘Π”., (*2)

Install

composer require alexpts/php-data-transformer2, (*3)

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° прСдставляСт собой Π±ΠΎΠ»Π΅Π΅ высокий ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π±ΠΈΠ»Π±ΠΈΠΎΡ‚Π΅ΠΊΠΈ https://github.com/alexpts/php-hydrator. Π Π°ΡΡˆΠΈΡ€ΡΡ Π΅Π΅ возмоТности ΠΈ упрощая Ρ€Π°Π±ΠΎΡ‚Ρƒ Π·Π° счСт:, (*4)

  • Π”Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ описания ΠΏΡ€Π°Π²ΠΈΠ» прСобразования
  • РСкурсивного прСобразования Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ ΠΈ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ
  • Π‘ΠΎΠ»Π΅Π΅ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½ΠΎΠ³ΠΎ синтаксиса

Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° схСм трансформации ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ описаны Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ https://github.com/alexpts/php-hydrator., (*5)

Data Transformer

Класс DataTransformer являСтся Π±ΠΎΠ»Π΅Π΅ высокоуровнСвым. Он позволяСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с HydratorService ΠΈ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ схСмы прСобразования для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ., (*6)

Для ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ мноТСство схСм прСобразования. Для прСобразования ΠΌΠΎΠ΄Π΅Π»ΠΈ для сохранСния Π² Π‘Π” трСбуСтся ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π² DTO ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ (массив php). ΠŸΡ€ΠΈ этом всС значСния Ρ‚ΠΈΠΏΠ° \DateTime ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² timestamp (integer Ρ‚ΠΈΠΏ). Если ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ эту ΠΆΠ΅ модСль Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Ρ‡Π΅Ρ€Π΅Π· REST API, Ρ‚ΠΎ схСма прСобразования ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΎΠΉ. ВсС значСния \DateTime Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ строки Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ISO8601., (*7)

use PTS\DataTransformer\DataTransformer;

$dataTransformer = new DataTransformer;
$dataTransformer->getMapsManager()->setMapDir(UserModel::class, __DIR__ . '/data');

$model = $dataTransformer->toModel(UserModel::class, [
    'id' => 1,
    'creAt' => new DateTime,
    'name' => 'Alex',
    'active' => 1,
]);

$dto = $dataTransformer->toDTO($model, 'dto');
$dtoForDb = $dataTransformer->toDTO($model, 'db');

Π’Π°Ρ€ΠΈΠ°Ρ†ΠΈΠΈ прСдставлСний

ΠœΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Ρ€Π°Π·Π½Ρ‹Ρ… сцСнариСв ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ ΠΏΡ€Π°Π²ΠΈΠΎΠ°ΠΌ ΠΈΠ· ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π›ΠΈΠ±ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ просто Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎΠ΅ прСдставлСиниС этой ΠΆΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π±Π΅Π· Π»ΠΈΡˆΠ½ΠΈΡ… Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ. МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСсколько схСм для 1 ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ short.dto:, (*8)

$shortFormatDto = $dataTransformer->toDTO($model, 'short.dto');

Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΠΎΠ»Π΅ΠΉ, Π±Π΅Π· Π½Π΅ΠΎΠ±ΡŠΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ схСму/map для прСобразования, ΡƒΠΊΠ°Π·Π°Π² ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΎΠΏΡ†ΠΈΡŽ excludeFields с массивом ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ Π² схСмС:, (*9)

$shortFormatDto = $dataTransformer->toDTO($model, 'dto', [
     'excludeFields' => ['password']
]);

ΠšΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ

НСбольшой сахар, Ρ‡Ρ‚ΠΎΠ±Ρ‹ пСрСвСсти ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ DTO:, (*10)

$mapName = 'dto';
$excludedFields = ['name'];
$dtoCollection = $dataTransformer->toDtoCollection($models, $mapName);

Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ

Если свойство ΠΌΠΎΠ΄Π΅Π»ΠΈ прСдставлСно Π΄Ρ€ΡƒΠ³ΠΎΠΉ модСлью ΠΈΠ»ΠΈ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠ΅ΠΉ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ рСкурсивно ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ/Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ модСль. Для этого Π² схСмС ΠΌΠ°ΠΏΠΏΠΈΠ½Π³Π° Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡ ref., (*11)

// map file deepDto.php
return [
    'id' => [],
    'creAt' => [],
    'name' => [],
    'login' => [],
    'active' => [
        'pipe-populate' => ['boolval'],
        'pipe-extract' => ['boolval'],
    ],
    'email' => [
        'pipe-populate' => [ // any callable
            'strval',
            'strtolower',
         ]
    ],
    'refModel' => [
        'ref' => [
            'model' => UserModel::class,
            'map' => 'dto'
        ]
    ],
    'refModels' => [
        'ref' => [
            'model' => UserModel::class,
            'map' => 'dto',
            'collection' => true
        ]
    ],
];

// code file
$model = $dataTransformer->toModel(UserModel::class, [
    'id' => 1,
    'creAt' => new DateTime,
    'name' => 'Alex',
    'active' => 1,
    'refModel' => [
        'id' => 2,
        'name' => 'refModel',
    ]
], 'deepDto');

$model2 = $dataTransformer->toModel(UserModel::class, [
    'id' => 1,
    'creAt' => new DateTime,
    'name' => 'Alex',
    'active' => 1,
    'refModels' => [ // collection ref models
        [
            'id' => 2,
            'name' => 'refModel',
        ],
        [
            'id' => 2,
            'name' => 'refModel',
        ]
    ]
], 'deepDto');

Π›ΠΎΠ³ΠΈΠΊΠ° Π² pipe ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°Ρ…

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ pipe ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ callable ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ. Π’ pipe ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ°ΡΡ‚ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏΡ‹. Π›ΠΈΠ±ΠΎ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Ρ‚ΡŒ поля ΠΏΠ΅Ρ€Π΅Π΄ записью Π² Π‘Π”. Π’ случаС нСобходимости, Ρ‡Ρ‚ΠΎΠ±Ρ‹ вся Π»ΠΎΠ³ΠΈΠΊΠ° ΠΌΠ°ΠΏΠΏΠΈΠ½Π³Π° Π±Ρ‹Π»Π° Π² 1 мСстС, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΊΠΈΠ½ΡƒΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ зависимости Ρ‡Π΅Ρ€Π΅Π· Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pipe, достав ΠΈΡ… ΠΈΠ· ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° $this->getContainer()., (*12)

<?php
/**
 * @var MapsManager $this
 */

use PTS\DataTransformer\MapsManager;

$encrypter = $this->getContainer()->get('encrypter');

return [
    'id' => [],
    'creAt' => [],
    'name' => [],
    'password' => [
        'pipe-populate' => [
            'strtolower',
            function(string $openPassword) use($encrypter) {
                return $encrypter->encrypt($openPassword);
            },
        ],
        'pipe-extract' => [
            function(string $ePassword) use($encrypter) {
                return $encrypter->decrypt($ePassword);
            },
            'strtolower'
        ],
    ]
];

migration

update 5 to 6, (*13)

The Versions

27/12 2017

dev-master

9999999-dev https://github.com/alexpts/php-data-transformer2

Convert model to dto, convert dto to model

  Sources   Download

MIT

The Requires

 

The Development Requires

by Avatar alexpts

model mapper converter data transform dto

27/12 2017

1.2.0

1.2.0.0 https://github.com/alexpts/php-data-transformer2

Convert model to dto, convert dto to model

  Sources   Download

MIT

The Requires

 

The Development Requires

by Avatar alexpts

model mapper converter data transform dto

08/10 2017

1.1.1

1.1.1.0 https://github.com/alexpts/php-data-transformer2

Convert model to dto, convert dto to model

  Sources   Download

MIT

The Requires

 

The Development Requires

by Avatar alexpts

model mapper converter data transform dto

28/07 2017

1.1.0

1.1.0.0 https://github.com/alexpts/php-data-transformer2

Convert model to dto, convert dto to model

  Sources   Download

MIT

The Requires

 

The Development Requires

by Avatar alexpts

model mapper converter data transform dto

18/06 2017

1.0.1

1.0.1.0 https://github.com/alexpts/php-data-transformer2

Convert model to dto, convert dto to model

  Sources   Download

MIT

The Requires

 

The Development Requires

by Avatar alexpts

model mapper converter data transform dto

17/06 2017

1.0.0

1.0.0.0 https://github.com/alexpts/php-data-transformer2

Convert model to dto, convert dto to model

  Sources   Download

MIT

The Requires

 

The Development Requires

by Avatar alexpts

model mapper converter data transform dto