acelot / automapper
Powerful declarative data mapper for PHP 8
Installs: 3 380
Dependents: 1
Suggesters: 0
Security: 0
Stars: 67
Watchers: 6
Forks: 2
Open Issues: 0
Requires
- php: ^8.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.13
- nikic/php-parser: ^4.15
- phpunit/phpunit: ^9.0
- respect/validation: ^2
Suggests
- respect/validation: Enables respect-validation integration
This package is auto-updated.
Last update: 2024-11-08 06:53:59 UTC
README
โน๏ธ You are on a branch with the second version of the acelot/automapper
.
If you want a previous version, then proceed to 1.x branch.
AutoMapper is a powerful declarative data mapper for PHP 8. AutoMapper can map data from any source data (usually array/object) to the existing array/object or marshal a new ones.
๐ฟ Install
composer require acelot/automapper:^2.0
๐ฟ Usage
How to marshal new array from the another?
use Acelot\AutoMapper\Context; use Acelot\AutoMapper\AutoMapper as a; $source = [ 'id' => '99', 'name' => [ 'lastname' => 'Doe', 'firstname' => 'John', ], 'skills' => 'Php, CSS,JS,html, MySql, brainfuck,' ]; $result = a::marshalArray( new Context(), $source, a::toKey('id', a::pipe( a::get('[id]'), a::toInt() )), a::toKey('fullname', a::pipe( a::get('[name]'), a::call(fn($v) => $v['firstname'] . ' ' . $v['lastname']) )), a::toKey('skills', a::pipe( a::get('[skills]'), a::explodeString(','), a::mapIterable(a::pipe( a::trimString(), a::ifEmpty(a::ignore()), a::call('strtolower') )), a::toArray(), a::sortArray() )) ); // Output of `var_export($result)` array( 'id' => 99, 'fullname' => 'John Doe', 'skills' => [ 0 => 'brainfuck', 1 => 'css', 2 => 'html', 3 => 'js', 4 => 'mysql', 5 => 'php', ], )
How to map data from source to the existing array?
Show the code
use Acelot\AutoMapper\Context; use Acelot\AutoMapper\AutoMapper as a; $source = [ 'title' => ' Product title ', 'desc' => [ 'Product short description', 'Product regular description', 'Product descriptive description', ] ]; $target = [ 'id' => 5, 'title' => 'Current title', ]; $result = a::map( new Context(), $source, $target, a::toKey('title', a::pipe( a::get('[title]'), a::trimString() )), a::toKey('description', a::get('[desc][#last]')), ); // Output of `var_export($result)` array ( 'id' => 5, 'title' => 'Product title', 'description' => 'Product descriptive description', )
๐ Examples
All examples can be found in tests/Functional
directory.
๐๏ธ Reference
No need to use concrete classes, it's better to use the AutoMapper API static functions.
It is very convenient to import the AutoMapper as a short alias, for example use Acelot\AutoMapper\AutoMapper as a
.
Main functions
The main functions of AutoMapper.
Field definitions
Definitions that helps you to shape the target structure.
Processors
Core value processors. The purpose of processors is to retrieve the value or mutate the incoming value and pass it to the next one.
Helpers
Helpers are the processors that built on top of the another processors. Some helpers are just a shorthands to the core processors with specific arguments, some of them are combination of the multiple processors.
๐งฉ Integrations
๐คจ FAQ
What is Context?
The Context
is a special DTO class for storing any kind of data: configs, DB connections, fixtures, etc.
This DTO is passed to the mapper, and you can use your data inside the processors.
Processors capable of working with the context end with Ctx
suffix, callCtx
for example.
How to use get
processor?
You can obtain any key/prop/method from the source using the get
processor which accepts a special path string.
The processor parses the given path and divides it into parts, then pulls out the data following the parts of the path.
Available path parts:
You can combine the parts to obtain the deep values:
[array_key][array key with spaces][#first][#last]->property->{property with spaces}->someMethod()
If any part of the path is not found, then the processor will return NotFoundValue
value.
This value throws an NotFoundException
but you can recover it using ifNotFound
helper.
๐๏ธ License
Licensed under MIT. Copyright (c) 2017-present, Valeriy Protopopov