Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

php-type-language/mapper

Open more actions menu

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%
Morty Proxy This is a proxified and sanitized view of the page, visit original site.