2017 © Pedro PelΓ‘ez
 

library php-data-transformer

Transform model to data and back

image

alexpts/php-data-transformer

Transform model to data and back

  • Saturday, June 17, 2017
  • by alexpts
  • Repository
  • 1 Watchers
  • 2 Stars
  • 42 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 0 Forks
  • 2 Open issues
  • 1 Versions
  • 0 % Grown

The README.md

php-data-transformer

Repository abandoned 2019-12-31

This repository has moved to alexpts/php-data-transformer2., (*1)

SensioLabsInsight, (*2)

Build Status Test Coverage Code Climate Scrutinizer Code Quality, (*3)

Π‘ΠΎΠ»Π΅Π΅ Π½ΠΎΠ²Ρ‹ΠΉ ΠΈ Π³ΠΈΠ±ΠΊΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ - https://github.com/alexpts/php-data-transformer2, (*4)

Одни ΠΈ Ρ‚Π΅ ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Ρ€Π°Π·Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅. Π’ ΠΊΠΎΠ΄Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с высокоуровнСвыми модСлями. Но для сохранСния этих Π΄Π°Π½Π½Ρ‹Ρ… Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π΄Π°Π½Π½Ρ‹Π΅ трСбуСтся пСрСвСсти Π² Π±ΠΎΠ»Π΅Π΅ простой Π²ΠΈΠ΄, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π² ассоциативный массив. Для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ прилоТСниями ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ простыС DTO сущности., (*5)

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ позволяСт Π»Π΅Π³ΠΊΠΎ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ваши Π΄Π°Π½Π½Ρ‹Π΅ Π² ассоциативный массив ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΈΠ· массива Π² Π²Π°ΡˆΡƒ модСль., (*6)

Вся схСма ΠΌΠ°ΠΏΠΏΠΈΠ½Π³Π° описываСтся Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ ΠΈ Π²Π½Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ. Позволяя для ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ схСмы ΠΌΠ°ΠΏΠΏΠΈΠ½Π³Π° ΠΈ трансформации ΠΏΠΎΠ»Π΅ΠΉ. НапримСр ΠΏΠΎΠ»Π΅ Ρ‚ΠΈΠΏΠ° DateTime ΠΏΠ΅Ρ€Π΅Π΄ сохрСнСниСм Π² mongoDB ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° MongoDate ΠΈΠ»ΠΈ UTCDateTime. ΠŸΠ΅Ρ€Π΅Π΄ ΠΎΡ‚Π΄Π°Ρ‡Π΅ΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² строку ISO8601. ΠŸΠ΅Ρ€Π΅Π΄ сохранСниСм Π² redis ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² timestamp., (*7)

Π”Π°Π½Π½Ρ‹Π΅ присланныС ΠΈΠ· Ρ„ΠΎΡ€ΠΌΡ‹ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° всСгда ΠΈΠΌΠ΅ΡŽΡ‚ стрковый Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, Π±ΡƒΠ΄ΡŒ Ρ‚ΠΎ числа ΠΈΠ»ΠΈ true/false. ВрансформСр Ρ€Π΅ΡˆΠ°Π΅Ρ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Π² ΠΌΠΎΠ΄Π΅Π»Π΅ Π΄Π°Π½Π½Ρ‹Π΅ всСгда Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠ΅Ρ€ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½Ρ‹ Π² Ρ‚ΠΈΠΏ, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π² ΠΊΠ°Ρ€Ρ‚Π΅ трансформации., (*8)

Installation

$ composer require alexpts/php-data-transformer, (*9)

ВрСбования

PHP 7.0+, (*10)

МодСли

Врансформатор Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ваши ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π’Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ с чистыми модСлями., (*11)

ВрансформСры

ΠŸΡ€ΠΈ трансформации ΠΌΠΎΠ΄Π΅Π»ΠΈ Π² массив ΠΈΠ»ΠΈ массива Π² модСль ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π² ΠΊΠ°Ρ€Ρ‚Π΅ трансформации. ΠšΠ°Ρ€Ρ‚Π° трансформации прСдставляСт собой yml Ρ„Π°ΠΉΠ» Π²ΠΈΠ΄Π°:, (*12)

id:
    type: int
    get: getId
login:
    type: string
    get: getLogin
    set: setLogin
name:
    type: string
    prop: name
active:
    type: bool
    prop: active
creAt:
    type: date
    get: getCreAt
email:
    type: string
    prop: email
postsIds:
    type: int
    coll: true
roles:
    type: refModels
    prop: roles
    rel:
        model: \\SomeNamespace\\Role
        map: dto

Π“Π΄Π΅ ΠΊΠ»ΡŽΡ‡ являСтся индСксом массива., (*13)

type - Ρ‚ΠΈΠΏ трансформСра, (*14)

coll - [optional] true|false являСтся Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠ΅ΠΉ, (*15)

prop - [optional] свойство ΠΌΠΎΠ΄Π΅Π»ΠΈ, (*16)

get - [optional] ΠΌΠ΅Ρ‚ΠΎΠ΄ Π³Π΅Ρ‚Ρ‚Π΅Ρ€ ΠΌΠΎΠ΄Π΅Π»ΠΈ (prop игнорируСтся), (*17)

set - [optional] ΠΌΠ΅Ρ‚ΠΎΠ΄ сСттСр ΠΌΠΎΠ΄Π΅Π»ΠΈ (prop игнорируСтся), (*18)

rel - [optional] ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΡΠ²ΡΠ·Π°Π½Π½ΡƒΡŽ ΠΌΠΎΠ΄Π΅Π»Ρ‚ΡŒ, (*19)

rel.model - [optional] ΠΏΠΎΠ»Π½Ρ‹ΠΉ стр ΠΎΠΊΠΎΠ²Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ класса связанной ΠΌΠΎΠ΄Π΅Π»ΠΈ, (*20)

rel.map - [optional] имя ΠΊΠ°Ρ€Ρ‚Ρ‹ трансформации Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ [ΡƒΠΌΠΎΠ»Ρ‡.: 'dto'], (*21)

ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ ΠΊΠ°Ρ€Ρ‚ трансформации

Для рСгистрации ΠΊΠ°Ρ€Ρ‚ трансформации ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ setMapDir ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΈΠΏΠ° MapsManager. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ - класс ΠΌΠΎΠ΄Π΅Π»ΠΈ. Π’Ρ‚ΠΎΡ€ΠΎΠΉ - дирСктория с ΠΊΠ°Ρ€Ρ‚Π°ΠΌΠΈ трансформации для этой ΠΌΠΎΠ΄Π΅Π»ΠΈ., (*22)

$mapsManager = new MapsManager(new Parser);
$mapsManager = setMapDir(UserModel::class, __DIR__ . '/transformers');

Model to DTO

$transformer = new DataTransformer(
    new TypeConverter,
    $mapsManager,
    new ModelClosure
);

МодСль пСрСдаСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ getData трансформатора. Π’Ρ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ указываСтся имя ΠΊΠ°Ρ€Ρ‚Ρ‹ трансформации для этой ΠΌΠΎΠ΄Π΅Π»ΠΈ. (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ dto)., (*23)

$user = new User('name', 'login', 'email@gmail.com');
$dtoUser = $transformer->getData($user, 'dto');

ΠŸΡƒΡ‚ΡŒ Ρ„Π°ΠΉΠ»Π° трансформации Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΈΠ΄:, (*24)

__DIR__ . '/transformers/dto.yml'., (*25)

Data to model

Π§Π΅Ρ€Π΅Π· эту ΠΆΠ΅ ΠΊΠ°Ρ€Ρ‚Ρƒ транфсформации Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠΌΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Ρ‹ Π½Π°Π·Π°Π΄ Π² модСль., (*26)

$data = [
    'name' => 'name',
    'login' => 'login',
    'email' => 'email@gmail.com'
];

$model = $transformer->createModel(User::class);
$transformer->fillModel($data, $model, 'dto');

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ коллСкция

Если ΠΏΠΎΠ»Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ прСдставлСно ΠΊΠΎΠ»Π΅Π»ΠΊΡ†ΠΈΠ΅ΠΉ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ³Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· Ρ‚ΠΈΠΏ трансформации ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ трансформированных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Для этого ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅ полю Π² ΠΊΠ°Ρ€Ρ‚Π΅ трансформации Ρ„Π»Π°Π³ coll: true. Π’ΠΎΠΆΠ΅ самоС ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ написав собствСнный Ρ‚ΠΈΠΏ трансформации, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сам Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅-ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ., (*27)

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

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ свои Ρ‚ΠΈΠΏΡ‹ трансформации для Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ трансформации Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ слуТит Ρ‚ΠΈΠΏ refModels. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ трансформации ΠΌΠΎΠ΄Π΅Π»ΠΈ с массивом Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ., (*28)

Π—Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ вмСсто Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ€Π°Π·ΡƒΠΌΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅Π΅ id. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚Π°ΠΊΠΎΠΉ трансформации являСтся Ρ‚ΠΈΠΏ refModelsToArrayStringId. Если id ΠΌΠΎΠ΄Π΅Π»ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ прСдставлСн Π½Π΅ строковым Ρ‚ΠΈΠΏΠΎΠΌ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ MongoId ΠΈΠ»ΠΈ ObjectId), Ρ‚ΠΎ просто ΠΎΠΏΠΈΡˆΠΈΡ‚Π΅ свой Ρ‚ΠΈΠΏ., (*29)

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ собствСнного Ρ‚ΠΈΠΏΠ°

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ свой Ρ‚ΠΈΠΏ трансформации с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ toData ΠΈ toModel. Новый Ρ‚ΠΈΠΏ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Ρ‚ΠΈΠΏΠ° TypeConverter ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ addType($name, $type). Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‚Π΅Ρ€Π΅Ρ‚ΡŒ стандатныС Ρ‚ΠΈΠΏΡ‹, замСстив ΠΈΡ… собтсвСнной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ., (*30)

МоТно ΠΎΡ‚Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ класса TypeConverter ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π² конуструкторС всС Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ., (*31)

The Versions

17/06 2017

dev-master

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

Transform model to data and back

  Sources   Download

MIT

The Requires

 

The Development Requires

by Avatar alexpts

model converter data transform dto