{"id":46453382,"url":"https://github.com/php-type-language/mapper","last_synced_at":"2026-03-06T01:01:33.225Z","repository":{"id":260149799,"uuid":"821871560","full_name":"php-type-language/mapper","owner":"php-type-language","description":"⚡ The best PHP mapper (hydrator/serializer) you've ever seen!","archived":false,"fork":false,"pushed_at":"2025-12-09T12:51:25.000Z","size":1379,"stargazers_count":34,"open_issues_count":2,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-02-11T23:28:56.199Z","etag":null,"topics":["data-mapper","denormalizer","deserializer","hydrator","mapper","marshal","marshaller","normalizer","serializer","transformer","typelang","types","unmarshal"],"latest_commit_sha":null,"homepage":"https://typelang.dev","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/php-type-language.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-06-29T17:20:40.000Z","updated_at":"2025-12-09T12:50:48.000Z","dependencies_parsed_at":"2024-11-19T22:34:32.974Z","dependency_job_id":"a80fa071-648a-403f-8a22-d57f341e698f","html_url":"https://github.com/php-type-language/mapper","commit_stats":null,"previous_names":["php-type-language/mapper"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/php-type-language/mapper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/php-type-language%2Fmapper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/php-type-language%2Fmapper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/php-type-language%2Fmapper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/php-type-language%2Fmapper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/php-type-language","download_url":"https://codeload.github.com/php-type-language/mapper/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/php-type-language%2Fmapper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30156843,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-05T22:39:40.138Z","status":"ssl_error","status_checked_at":"2026-03-05T22:39:24.771Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-mapper","denormalizer","deserializer","hydrator","mapper","marshal","marshaller","normalizer","serializer","transformer","typelang","types","unmarshal"],"created_at":"2026-03-06T01:01:31.625Z","updated_at":"2026-03-06T01:01:33.142Z","avatar_url":"https://github.com/php-type-language.png","language":"PHP","readme":"\u003ca href=\"https://github.com/php-type-language\" target=\"_blank\"\u003e\n    \u003cimg align=\"center\" src=\"https://github.com/php-type-language/.github/blob/master/assets/dark.png?raw=true\"\u003e\n\u003c/a\u003e\n\n---\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://packagist.org/packages/type-lang/mapper\"\u003e\u003cimg src=\"https://poser.pugx.org/type-lang/mapper/require/php?style=for-the-badge\" alt=\"PHP 8.1+\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://packagist.org/packages/type-lang/mapper\"\u003e\u003cimg src=\"https://poser.pugx.org/type-lang/mapper/version?style=for-the-badge\" alt=\"Latest Stable Version\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://packagist.org/packages/type-lang/mapper\"\u003e\u003cimg src=\"https://poser.pugx.org/type-lang/mapper/v/unstable?style=for-the-badge\" alt=\"Latest Unstable Version\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://raw.githubusercontent.com/php-type-language/mapper/blob/master/LICENSE\"\u003e\u003cimg src=\"https://poser.pugx.org/type-lang/mapper/license?style=for-the-badge\" alt=\"License MIT\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/php-type-language/mapper/actions\"\u003e\u003cimg src=\"https://github.com/php-type-language/mapper/workflows/tests/badge.svg\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\nThe best PHP mapper you've ever seen =)\n\nYou can see some [examples here](/example):\n\n- [01.normalization](/example/01.normalization)\n    - [01.object-normalization](/example/01.normalization/01.object-normalization.php)\n    - [02.date-normalization](/example/01.normalization/02.date-normalization.php)\n    - [03.date-format-normalization](/example/01.normalization/03.date-format-normalization.php)\n    - [04.untyped-object-normalization](/example/01.normalization/04.untyped-object-normalization.php)\n    - [05.typed-object-normalization](/example/01.normalization/05.typed-object-normalization.php)\n    - [06.inherited-types-normalization](/example/01.normalization/06.inherited-types-normalization.php)\n    - [07.collection-types-normalization](/example/01.normalization/07.collection-types-normalization.php)\n    - [08.object-output-normalization](/example/01.normalization/08.object-output-normalization.php)\n- [02.errors](/example/02.errors)\n    - [01.custom-type-printer](/example/02.errors/01.custom-type-printer.php)\n    - [02.extended-type-printer](/example/02.errors/02.extended-type-printer.php)\n    - [03.custom-path-printer](/example/02.errors/03.custom-value-printer.php)\n    - [04.custom-value-printer](/example/02.errors/04.custom-path-printer.php)\n- [03.types](/example/03.types)\n    - [01.type-platforms](/example/03.types/01.type-platforms.php)\n    - [02.custom-type](/example/03.types/02.custom-type.php)\n    - [03.custom-type-template-arguments](/example/03.types/03.custom-type-template-arguments.php)\n    - [04.custom-platform](/example/03.types/04.custom-platform.php)\n    - [05.custom-type-callable](/example/03.types/05.custom-type-callable.php)\n    - [06.custom-type-psr-container](/example/03.types/06.custom-type-psr-container.php)\n- [04.mapping-readers](/example/04.mapping-readers)\n  - [01.reflection-mapping.php](/example/04.mapping-readers/01.reflection-mapping.php)\n  - [02.attribute-mapping.php](/example/04.mapping-readers/02.attribute-mapping.php)\n  - [03.phpdoc-mapping.php](/example/04.mapping-readers/03.phpdoc-mapping.php)\n  - [04.array-mapping.php](/example/04.mapping-readers/04.array-mapping.php)\n  - [05.php-config-mapping.php](/example/04.mapping-readers/05.php-config-mapping.php)\n  - [06.yaml-config-mapping.php](/example/04.mapping-readers/06.yaml-config-mapping.php)\n  - [07.neon-config-mapping.php](/example/04.mapping-readers/07.neon-config-mapping.php)\n  - [08.inheritance.php](/example/04.mapping-readers/08.inheritance.php)\n- [05.mapping-providers](/example/05.mapping-providers)\n  - [01.default-provider.php](/example/05.mapping-providers/01.default-provider.php)\n  - [02.in-memory-provider.php](/example/05.mapping-providers/02.in-memory-provider.php)\n  - [03.psr6-provider.php](/example/05.mapping-providers/03.psr6-provider.php)\n  - [04.psr16-provider.php](/example/05.mapping-providers/04.psr16-provider.php)\n  - [05.second-level-cache.php](/example/05.mapping-providers/05.second-level-cache.php)\n  - [06.inheritance.php](/example/05.mapping-providers/06.inheritance.php)\n\n\u003e Full documentation in progress...\n\n## Installation\n\nMapper package is available as Composer repository and can be installed\nusing the following command in a root of your project:\n\n```sh\ncomposer require type-lang/mapper\n```\n\n## Quick Start\n\n```php\nuse TypeLang\\Mapper\\Mapping\\MapType;\n\nclass ExampleObject\n{\n    public function __construct(\n        #[MapType('list\u003cnon-empty-string\u003e')]\n        public readonly array $names,\n    ) {}\n}\n\n$mapper = new \\TypeLang\\Mapper\\Mapper();\n\n$result = $mapper-\u003enormalize(\n    new ExampleObject(['Example'])\n);\n// Expected Result:\n//\n// array:1 [\n//   \"names\" =\u003e array:1 [\n//     0 =\u003e \"Example\"\n//   ]\n// ]\n\n\n$result = $mapper-\u003edenormalize([\n    'names' =\u003e ['first', 'second']\n], ExampleObject::class);\n// Expected Result:\n//\n// ExampleObject {#324\n//   +names: array:2 [\n//     0 =\u003e \"first\"\n//     1 =\u003e \"second\"\n//   ]\n// }\n\n\n$result = $mapper-\u003edenormalize([\n    'names' =\u003e ['first', 'second', ''],\n], ExampleObject::class);\n// Expected Result:\n//\n// InvalidFieldTypeValueException: Passed value of field \"names\" must be of type\n//   list\u003cnon-empty-string\u003e, but array(3)[\"first\", \"second\", \"\"] given at $.names[2]\n```\n\n## Benchmarks\n\nResults [here](https://github.com/php-type-language/mapper/actions/workflows/bench.yml)\nlike [this](https://github.com/php-type-language/mapper/actions/runs/11924690471/job/33235475673#step:6:10).\n\nSample: An object that contains a collection of objects, which contains\nanother collection of objects.\n\n```php\nobject\u003cExampleObject\u003e{\n    name: string,\n    items: list\u003cExampleObject\u003e\n}\n```\n\nThe results are sorted by mode time.\n\n### Denormalization\n\nDenormalization: For example, conversion from JSON to PHP Object.\n\n| benchmark                       | memory    | min       | mode        | rstdev |\n|---------------------------------|-----------|-----------|-------------|--------|\n| TypeLangStrictAttributesBench   | 1.929mb   | 91.180μs  | 105.264μs   | ±6.99% |\n| TypeLangStrictPhpDocBench       | 2.048mb   | 98.860μs  | 108.488μs   | ±4.40% |\n| TypeLangPhpDocBench             | 2.050mb   | 103.380μs | 106.407μs   | ±5.91% |\n| TypeLangAttributesBench         | 1.930mb   | 104.490μs | 113.736μs   | ±4.23% |\n| JMSAttributesBench              | 3.141mb   | 137.040μs | 142.373μs   | ±6.78% |\n| ValinorBench                    | 2.701mb   | 227.370μs | 252.458μs   | ±4.59% |\n| SymfonyPHPStanExtractorBench    | 3.678mb   | 371.650μs | 392.908μs   | ±2.86% |\n| SymfonyPhpDocExtractorBench     | 4.027mb   | 379.740μs | 387.303μs   | ±3.21% |\n\n### Normalization\n\nNormalization: For example, conversion from PHP Object to JSON.\n\n| benchmark                       | memory    | min         | mode      | rstdev   |\n|---------------------------------|-----------|-------------|-----------|----------|\n| ValinorBench                    | 1.966mb   | 62.570μs    | 69.184μs  | ±3.99%   |\n| TypeLangStrictAttributesBench   | 1.845mb   | 81.090μs    | 88.343μs  | ±6.75%   |\n| TypeLangPhpDocBench             | 1.965mb   | 81.800μs    | 90.504μs  | ±5.99%   |\n| TypeLangAttributesBench         | 1.891mb   | 85.320μs    | 89.900μs  | ±5.15%   |\n| TypeLangStrictPhpDocBench       | 1.967mb   | 89.920μs    | 94.865μs  | ±2.62%   |\n| SymfonyPHPStanExtractorBench    | 2.086mb   | 93.160μs    | 100.173μs | ±5.41%   |\n| SymfonyPhpDocExtractorBench     | 2.405mb   | 96.290μs    | 98.729μs  | ±4.17%   |\n| JMSAttributesBench              | 3.770mb   | 131.420μs   | 150.310μs | ±5.85%   |\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphp-type-language%2Fmapper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphp-type-language%2Fmapper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphp-type-language%2Fmapper/lists"}