Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/pfazzi/simplex-mapper
A simple PHP library to transfer data from a source (object or array) to an object.
https://github.com/pfazzi/simplex-mapper
mapping orm php sql
Last synced: 9 days ago
JSON representation
A simple PHP library to transfer data from a source (object or array) to an object.
- Host: GitHub
- URL: https://github.com/pfazzi/simplex-mapper
- Owner: pfazzi
- Created: 2022-01-04T20:17:19.000Z (almost 3 years ago)
- Default Branch: master
- Last Pushed: 2022-01-07T08:59:20.000Z (almost 3 years ago)
- Last Synced: 2024-09-27T12:17:30.814Z (about 2 months ago)
- Topics: mapping, orm, php, sql
- Language: PHP
- Homepage:
- Size: 37.1 KB
- Stars: 4
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# SimplexMapper
A simple PHP library to transfer data from a source (object or array) to an object.
```php
$dbData = [
'username' => 'pfazzi',
'emailAddress' => '[email protected]',
'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
```bash
composer require pfazzi/simplex-mapper
```## Usage
### Map
Maps the source data to a new instance of the target class
```php
$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:
```php
$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:
```php
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:
```php
$readModel = new Supplier(
(int) $data['id'],
$data['taxId'],
'1' == $data['isEnabled'],
);
```With SimplexMapper all you need to write is just the following line:
```php
$readModel = $this->mapper->map($data, Supplier::class);
```