Thanks to visit codestin.com
Credit goes to github.com

Skip to content

php-type-language/mapper

Repository files navigation


PHP 8.1+ Latest Stable Version Latest Unstable Version License MIT

The best PHP mapper you've ever seen =)

You can see some examples here:

Full documentation in progress...

Installation

Mapper package is available as Composer repository and can be installed using the following command in a root of your project:

composer require type-lang/mapper

Quick Start

use TypeLang\Mapper\Mapping\MapType;

class ExampleObject
{
    public function __construct(
        #[MapType('list<non-empty-string>')]
        public readonly array $names,
    ) {}
}

$mapper = new \TypeLang\Mapper\Mapper();

$result = $mapper->normalize(
    new ExampleObject(['Example'])
);
// Expected Result:
//
// array:1 [
//   "names" => array:1 [
//     0 => "Example"
//   ]
// ]


$result = $mapper->denormalize([
    'names' => ['first', 'second']
], ExampleObject::class);
// Expected Result:
//
// ExampleObject {#324
//   +names: array:2 [
//     0 => "first"
//     1 => "second"
//   ]
// }


$result = $mapper->denormalize([
    'names' => ['first', 'second', ''],
], ExampleObject::class);
// Expected Result:
//
// InvalidFieldTypeValueException: Passed value of field "names" must be of type
//   list<non-empty-string>, but array(3)["first", "second", ""] given at $.names[2]

Benchmarks

Results here like this.

Sample: An object that contains a collection of objects, which contains another collection of objects.

object<ExampleObject>{
    name: string,
    items: list<ExampleObject>
}

The results are sorted by mode time.

Denormalization

Denormalization: For example, conversion from JSON to PHP Object.

benchmark memory min mode rstdev
TypeLangStrictAttributesBench 1.929mb 91.180μs 105.264μs ±6.99%
TypeLangStrictPhpDocBench 2.048mb 98.860μs 108.488μs ±4.40%
TypeLangPhpDocBench 2.050mb 103.380μs 106.407μs ±5.91%
TypeLangAttributesBench 1.930mb 104.490μs 113.736μs ±4.23%
JMSAttributesBench 3.141mb 137.040μs 142.373μs ±6.78%
ValinorBench 2.701mb 227.370μs 252.458μs ±4.59%
SymfonyPHPStanExtractorBench 3.678mb 371.650μs 392.908μs ±2.86%
SymfonyPhpDocExtractorBench 4.027mb 379.740μs 387.303μs ±3.21%

Normalization

Normalization: For example, conversion from PHP Object to JSON.

benchmark memory min mode rstdev
ValinorBench 1.966mb 62.570μs 69.184μs ±3.99%
TypeLangStrictAttributesBench 1.845mb 81.090μs 88.343μs ±6.75%
TypeLangPhpDocBench 1.965mb 81.800μs 90.504μs ±5.99%
TypeLangAttributesBench 1.891mb 85.320μs 89.900μs ±5.15%
TypeLangStrictPhpDocBench 1.967mb 89.920μs 94.865μs ±2.62%
SymfonyPHPStanExtractorBench 2.086mb 93.160μs 100.173μs ±5.41%
SymfonyPhpDocExtractorBench 2.405mb 96.290μs 98.729μs ±4.17%
JMSAttributesBench 3.770mb 131.420μs 150.310μs ±5.85%