mirror of
https://github.com/danog/Valinor.git
synced 2024-11-26 20:24:40 +01:00
e437d9405c
In some situations the type handled by a constructor is only known at runtime, in which case the constructor needs to know what class must be used to instantiate the object. For instance, an interface may declare a static constructor that is then implemented by several child classes. One solution would be to register the constructor for each child class, which leads to a lot of boilerplate code and would require a new registration each time a new child is created. Another way is to use the attribute `\CuyZ\Valinor\Mapper\Object\DynamicConstructor`. When a constructor uses this attribute, its first parameter must be a string and will be filled with the name of the actual class that the mapper needs to build when the constructor is called. Other arguments may be added and will be mapped normally, depending on the source given to the mapper. ```php interface InterfaceWithStaticConstructor { public static function from(string $value): self; } final class ClassWithInheritedStaticConstructor implements InterfaceWithStaticConstructor { private function __construct(private SomeValueObject $value) {} public static function from(string $value): self { return new self(new SomeValueObject($value)); } } (new \CuyZ\Valinor\MapperBuilder()) ->registerConstructor( #[\CuyZ\Valinor\Attribute\DynamicConstructor] function (string $className, string $value): InterfaceWithStaticConstructor { return $className::from($value); } ) ->mapper() ->map(ClassWithInheritedStaticConstructor::class, 'foo'); ``` |
||
---|---|---|
.github | ||
docs | ||
qa | ||
src | ||
tests | ||
.changelog | ||
.gitattributes | ||
.gitignore | ||
.php-cs-fixer.dist.php | ||
composer.json | ||
composer.lock | ||
infection.json.dist | ||
LICENSE.md | ||
phpstan.neon.dist | ||
phpunit.xml.dist | ||
psalm.xml | ||
README.md | ||
rector.php |
Valinor • PHP object mapper with strong type support
Valinor is a PHP library that helps to map any input into a strongly-typed value object structure.
The conversion can handle native PHP types as well as other well-known advanced type annotations like array shapes, generics and more.
Installation
composer require cuyz/valinor
Documentation
Documentation can be found at valinor.cuyz.io.
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.
I also want to thank Blackfire for providing a license of their awesome tool, leading to notable performance gains when using this library.