pfazzi / simplex-mapper
A simple mapping library
Installs: 3 782
Dependents: 0
Suggesters: 0
Security: 0
Stars: 4
Watchers: 1
Forks: 0
Open Issues: 0
Requires
- php: >=8.0
Requires (Dev)
- phpunit/phpunit: ^9.5
- vimeo/psalm: ^4.17
This package is auto-updated.
Last update: 2025-01-07 15:32:06 UTC
README
A simple PHP library to transfer data from a source (object or array) to an object.
$dbData = [ 'username' => 'pfazzi', 'emailAddress' => 'pfazzi@test.com', 'isEnabled' => '1', ]; $mapper = new \Pfazzi\SimplexMapper\Mapper(); $user = $mapper->map( source: $dbData, target: User::class, );
Are you looking for an easy way to convert an array to an object?
Do you want to map a DTO to a domain object?
Do you want to hydrate an object from an array?
Use SimplexMapper!
Features
- Easy to use
- Zero configuration
- Zero dependencies
- Supports PHP 8 union types
- Supports nested objects
- Uses reflection, no need to modify your objects
Installation
Install SimplexMapper with composer
composer require pfazzi/simplex-mapper
Usage
Map
Maps the source data to a new instance of the target class
$mapper = new \Pfazzi\SimplexMapper\Mapper(); // From Array $userEntity = $mapper->map(source: ['name' => 'patrick'], target: UserEntity::class); // From stdClass $rawData = new \stdClass(); $rawData->name = 'Patrick'; $userEntity = $mapper->map(source: $rawData, target: UserEntity::class); // From anonymous class $rawData = new class { public function __construct(private string $name = 'Patrick') {} }; $userEntity = $mapper->map(source: $rawData, target: UserEntity::class); // From object $rawData = new UserDto('Patrick'); $userEntity = $mapper->map(source: $rawData, target: UserEntity::class);
Hydrate
Hydrates an object instance with data from the source:
$mapper = new \Pfazzi\SimplexMapper\Mapper(); $userEntity = $entityManager->find(UserEntity::class, 1); // From Array $mapper->hydrate(source: ['name' => 'patrick'], target: $userEntity); // From stdClass $rawData = new \stdClass(); $rawData->name = 'Patrick'; $mapper->map(source: $rawData, target: $userEntity); // From anonymous class $rawData = new class { public function __construct(private string $name = 'Patrick') {} }; $mapper->map(source: $rawData, target: $userEntity); // From object $rawData = new UserDto('Patrick'); $mapper->map(source: $rawData, target: $userEntity);
Use Cases
Map database data to read models
You want to read data from supplier table using Doctrine DBAL Connection and instantiate a Supplier read model:
class Supplier { public function __construct( public int $id, public string $taxId, public bool $onConsignment, ) { } } $result = $connection->executeQuery(<<<'SQL' SELECT supplier.id, supplier.tax_id AS taxId, supplier.is_enabled AS isEnabled FROM supplier WHERE supplier.tax_id = :taxId SQL, ['taxId' => $taxId]); $data = $result->fetchAssociative();
Without SimplexMapper you have to write mapping code, such as:
$readModel = new Supplier( (int) $data['id'], $data['taxId'], '1' == $data['isEnabled'], );
With SimplexMapper all you need to write is just the following line:
$readModel = $this->mapper->map($data, Supplier::class);