Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/blacktrs/data-transformer

Zero-dependency PHP array-to-object transformer
https://github.com/blacktrs/data-transformer

array-transformer data-transfer-object php php-library php82

Last synced: 3 days ago
JSON representation

Zero-dependency PHP array-to-object transformer

Awesome Lists containing this project

README

        

![Scrutinizer coverage](https://img.shields.io/scrutinizer/coverage/g/blacktrs/data-transformer/main) 
![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/blacktrs/data-transformer/php.yaml) 
![Packagist Version](https://img.shields.io/packagist/v/blacktrs/data-transformer)

# Data transformer

The modern PHP library for converting arrays into objects and vice-versa.

## Installation

`composer require blacktrs/data-transformer`

## Summary

By default, the library will try to resolve `public` properties and match the with array fields.
The transformer is trying to find an object property with equal name as array field.
In case, if object missing such fields, the transformer converts array keys into camel case.
However, it is possible to configure needed properties with attributes.

### Features
* Seamless converting of objects into arrays and vice-versa
* Auto conversion of nested properties with class type-hint into array and vice-versa
* The library respects the declared property type
* The library will respect private properties unless they will be declared explicitly as writable by the attribute
* The library takes into account getters or methods with the same name as a property
* Enum conversion
* Stringable objects conversion
* Configurable custom property value resolvers
* Configurable custom object transformers

## Configuration

Default transformer implementation `\Blacktrs\DataTransformer\Transformer\Transformer`
allows to force private properties write by using method `setIncludePrivateProperties` or constructor parameter `$includePrivateProperties`

### Attribute `DataField`
This attribute is applicable to properties. By this attribute you can configure the behavior for each property you need

The following parameters can be specified:
* `string|null $nameIn` Field name in an input array to map with the property
* `string|null $nameOut` Field name in an output array to fill with the property data
* `ValueResolverInterface|class-string|null $valueResolver` Custom value resolver to convert property data in a needed way
* `array $valueResolverArguments` Additional arguments passed into value resolver
* `TransformerInterface|class-string|null $objectTransformer` Custom property transformer to achieve more control in case if object passed
* `bool $ignoreTransform` Skip property while transforming an array into the object
* `bool $ignoreSerialize` Skip property while serializing an object into array

### Attribute `DataObject`
This attribute is applicable to classes and allows to use custom object serializer while converting object into other form

The following parameters can be specified:
* `ObjectSerializerInterface|class-string|null $objectTransformer` Custom object serializer

## Examples

### Convert the array into the object

```php
use Blacktrs\DataTransformer\Attribute\DataField;
use Blacktrs\DataTransformer\Value\DateTimeValueResolver;
use Blacktrs\DataTransformer\Transformer\Transformer;

class RequestObject
{
public readonly int $id;
public readonly string $email;
public readonly string $name;
#[DataField(valueResolver: DateTimeValueResolver::class)]
public readonly \DateTime $date;
}

$requestPayload = ['id' => 1, 'email' => '[email protected]', 'name' => 'John Doe', 'date' => '2023-06-01 10:10:10'];

$transformer = new Transformer();
$requestObject = $transformer->transform(RequestObject::class, $requestPayload);

echo $requestObject->id; // 1
echo $requestObject->email; // [email protected]
echo $requestObject->name; // John Doe
echo $requestObject->date->format('Y-m-d'); // 2023-06-01
```

### Convert the object into the array

```php
use Blacktrs\DataTransformer\Serializer\ObjectSerializer;

class ResponseObject
{
public function __construct(
public readonly int $id,
public readonly string $email,
public readonly string $name
) {
}
}

$responseObject = new ResponseObject(
id: 1,
email: '[email protected]',
name: 'John Doe'
);

$serializer = new ObjectSerializer();
$responseArray = $serializer->serialize($responseObject);

echo $responseArray['id']; // 1
```

### More examples
More examples could be found in `tests`