cuiz/valinor

库,帮助将任何输入映射到强类型值对象结构。

资助包维护!
romm

安装次数: 1,461,389

依赖者: 61

建议者: 0

安全性: 2

星标: 1,291

关注者: 17

分支: 74

开放问题: 32

1.13.0 2024-09-02 12:57 UTC

README

Valinor banner

— 从无聊的旧数组到闪亮的类型化对象 —

Latest Stable Version PHP Version Require Total Downloads Mutation testing badge

Valinor 负责原始输入(JSON、纯数组等)到对象的构建和验证,确保状态完全有效。它允许在整个应用程序生命周期中无需担心对象的整体性。

验证系统将检测任何错误的值,并通过提供精确且易于阅读的错误消息来帮助开发者。

映射器可以处理原生 PHP 类型,以及由 PHPStan 和 Psalm 支持的其他高级类型,如形状数组、泛型、整数范围等。

该库还提供了一种规范化机制,可以将任何输入转换成数据格式(JSON、CSV 等),同时保留原始结构。

安装

composer require cuyz/valinor

📔 更多信息请参阅 在线文档

示例

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…
}

文档

完整文档可在 valinor.cuyz.io 上找到。

致谢 & 感谢

这个库的开发主要是由许多人的友好话语和帮助激发的。我非常感谢每一个人,特别是这个存储库的直接贡献者,他们直接帮助推动项目向前发展。

我还想感谢 blackfire-logo Blackfire 为提供他们出色的工具提供许可证,这在使用这个库时带来了显著的性能提升。