cuyz/valinor

Dependency free PHP library that helps to map any input into a strongly-typed structure.

Maintainers

πŸ‘ Romm

Package info

github.com/CuyZ/Valinor

pkg:composer/cuyz/valinor

Fund package maintenance!

romm

Statistics

Installs: 12 560 088

Dependents: 121

Suggesters: 1

Stars: 1 506

Open Issues: 39

2.4.0 2026-03-23 17:38 UTC

Requires

  • php: ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0

Suggests

None

Provides

None

Conflicts

Replaces

None

MIT 3b0afa3a287ed7f3a69aab223726cf1139454c34

yamljsontreearrayobjectconversionmappingmapperhydrator


README

πŸ‘ Valinor banner

β€” From boring old arrays to shiny typed objects β€”

πŸ‘ Latest Stable Version
πŸ‘ PHP Version Require
πŸ‘ Total Downloads
πŸ‘ Mutation testing badge

Valinor takes care of the construction and validation of raw inputs (JSON, plain arrays, etc.) into objects, ensuring a perfectly valid state. It allows the objects to be used without having to worry about their integrity during the whole application lifecycle.

The validation system will detect any incorrect value and help the developers by providing precise and human-readable error messages.

The mapper can handle native PHP types as well as other advanced types supported by PHPStan and Psalm like shaped arrays, generics, integer ranges and more.

The library also provides a normalization mechanism that can help transform any input into a data format (JSON, CSV, …), while preserving the original structure.

Installation

composer require cuyz/valinor

πŸ“” Read more on the online documentation

Example

final class Country
{
 public function __construct(
 /** @var non-empty-string */
 public readonly string $name,
 
 /** @var list<City> */
 public readonly array $cities,
 ) {}
}

final class City
{
 public function __construct(
 /** @var non-empty-string */
 public readonly string $name,
 
 public readonly DateTimeZone $timeZone,
 ) {}
}

$json = <<<JSON
 {
 "name": "France",
 "cities": [
 {"name": "Paris", "timeZone": "Europe/Paris"},
 {"name": "Lyon", "timeZone": "Europe/Paris"}
 ]
 }
JSON;

try {
 $country = (new \CuyZ\Valinor\MapperBuilder())
 ->mapper()
 ->map(Country::class, \CuyZ\Valinor\Mapper\Source\Source::json($json));

 echo $country->name; // France 
 echo $country->cities[0]->name; // Paris
} catch (\CuyZ\Valinor\Mapper\MappingError $error) {
 // Handle the error…
}

Documentation

The full documentation is available on valinor-php.dev.

Credits & thank you

The development of this library is mainly motivated by the kind words and the help of many people. I am grateful to everyone, especially to the contributors of this repository who directly help to push the project forward:

πŸ‘ Image

Powered by

πŸ‘ PhpStorm logo

I have to give JetBrains credits for providing a free PhpStorm license for the development of this open-source package.

Special thanks

I also want to thank πŸ‘ Blackfire logo
Blackfire for providing a license of their awesome tool, leading to notable performance gains when using this library.