更新日志 1.0.0 — 2022 年 11 月 28 日¶
第一个稳定版本! 🥳🎉
此版本标志着初始开发阶段的结束。截至目前,该库已经上线一年了,并且足够稳定,可以开始遵循语义版本控制——这意味着任何向后不兼容的更改(也称为破坏性更改)都将导致主要版本的升级。
这是该项目(迄今为止™)实现的最大里程碑;我要感谢所有参与其中的人,特别是那些提交高质量拉取请求以改进库的贡献者。
我还要感谢一个人:我最好的朋友内森(Nathan) ,他一直非常支持我的业余项目。谢谢兄弟! 🙌
去年我在 OSS 贡献上投入了更多的时间;我已经向自己证明,我能够遵循一种稳定的方式来管理我对这个社区的参与,这就是为什么我在我的个人资料上启用了赞助,以允许人们❤️赞助我在 GitHub 上的工作- 如果您在应用程序中使用这个库,请考虑时不时地给我一个🍺! 🤗
重要变更¶
终止 PHP 7.4 支持
PHP 7.4 安全支持已于 2022 年 11 月 28 日结束;该库现在支持的最低版本是 PHP 8.0。
用于映射可调用参数的新映射器
这个新的映射器可用于在调用函数/方法之前确保源具有正确的形状。
映射器构建器的配置方式与树映射器相同,例如自定义类型严格性。
$someFunction = function(string $foo, int $bar): string {
return "$foo / $bar";
};
try {
$arguments = (new \CuyZ\Valinor\MapperBuilder())
->argumentsMapper()
->mapArguments($someFunction, [
'foo' => 'some value',
'bar' => 42,
]);
// some value / 42
echo $someFunction(...$arguments);
} catch (\CuyZ\Valinor\Mapper\MappingError $error) {
// Do something…
}
对TimeZone对象的支持
现在通过适当的错误处理支持本机TimeZone对象构造。
try {
(new \CuyZ\Valinor\MapperBuilder())
->mapper()
->map(DateTimeZone::class, 'Jupiter/Europa');
} catch (MappingError $exception) {
$error = $exception->node()->messages()[0];
// Value 'Jupiter/Europa' is not a valid timezone.
echo $error->toString();
}
映射具有一个属性的对象
当一个类只需要一个值时,提供给映射器的源必须与单个属性/参数的类型匹配。
这一更改旨在使映射器在映射需要一个参数的对象时的行为方式保持一致。在此更改之前,源可以匹配所需的类型,也可以是具有单个条目和以参数命名的键的数组。
请参阅下面的示例:
final class Identifier
{
public readonly string $value;
}
final class SomeClass
{
public readonly Identifier $identifier;
public readonly string $description;
}
(new \CuyZ\Valinor\MapperBuilder())->mapper()->map(SomeClass::class, [
'identifier' => ['value' => 'some-identifier'], // ❌
'description' => 'Lorem ipsum…',
]);
(new \CuyZ\Valinor\MapperBuilder())->mapper()->map(SomeClass::class, [
'identifier' => 'some-identifier', // ✅
'description' => 'Lorem ipsum…',
]);
从 0.x 升级到 1.0 ¶
由于这是一个主要版本,所有已弃用的功能都已被删除,从而导致了大量的重大更改。
您可以单击下面的条目来获取有关可用替代品的建议。
Doctrine注释支持删除
不能再使用Doctrine注解,必须使用PHP特性。
BackwardCompatibilityDateTimeConstructor类删除
您必须使用映射器构建器中可用的方法,请参阅处理日期章节。
Mapper构建器flexible方法去除
灵活已分为三种不同的模式,请参阅类型严格性和灵活性章节。
Mapper 构建器withCacheDir方法删除
您现在必须直接注册缓存实例,请参阅性能和缓存章节。
StaticMethodConstructor类移除
您现在必须使用映射器构建器注册构造函数,请参阅自定义对象构造函数章节。
映射器构建器bind方法删除
您现在必须使用映射器构建器注册构造函数,请参阅自定义对象构造函数章节。
ThrowableMessage类删除
您现在必须使用MessageBuilder类,请参阅错误处理章节。
MessagesFlattener类删除
您现在必须使用Messages类,请参阅错误处理章节。
TranslatableMessage类删除
您现在必须使用HasParameters类,请参阅自定义异常章节。
消息方法删除
以下方法已被删除:
\CuyZ\Valinor\Mapper\Tree\Message\NodeMessage::name()\CuyZ\Valinor\Mapper\Tree\Message\NodeMessage::path()\CuyZ\Valinor\Mapper\Tree\Message\NodeMessage::type()\CuyZ\Valinor\Mapper\Tree\Message\NodeMessage::value()\CuyZ\Valinor\Mapper\Tree\Node::value()
仍然可以使用方法\CuyZ\Valinor\Mapper\Tree\Message\NodeMessage::node()获取所需的值。
占位符{original_value}也已被删除,可以使用{source_value}获取相同的值。
PlaceHolderMessageFormatter类删除
其他功能可用于格式化消息,请参阅错误消息自定义章节。
Identifier特性删除
自首次公开发布以来,此功能一直是该库的一部分,但从未记录在案,因为它不符合该库的主要理念之一,即几乎完全与应用程序的域层解耦。
该功能已被完全删除,并且不打算用替代方案取代,除非社区确实认为需要类似的功能。
⚠ 重大变更¶
- 映射到具有一个参数的对象时禁止数组 ( 72cba3 )
- 将树映射器和参数映射器标记为
@pure( 0d9855 ) - 删除已弃用的向后兼容性日期时间构造函数 ( a65e8d )
- 删除已弃用的类
ThrowableMessage( d36ca9 ) - 删除已弃用的类以扁平化消息 ( f9ed93 )
- 删除已弃用的接口
TranslatableMessage( ceb197 ) - 删除已弃用的消息方法 ( e6557d )
- 删除已弃用的方法构造函数特性 ( d76467 )
- 删除已弃用的方法以启用灵活模式 ( a2bef3 )
- 删除已弃用的设置缓存目录的方法( b0d6d2 )
- 删除用于绑定回调的已弃用方法( b79ed8 )
- 删除已弃用的占位符消息格式化程序( c2723d )
- 删除 Doctrine 注释支持 ( 66c182 )
- 删除标识符特性 ( 8a7486 )
- 删除 PHP 7.4 支持 ( 5f5a50 )
- 删除对
strict-array类型的支持 ( 22c3b4 )
新功能¶
错误修复¶
- 允许将
null映射到单节点可空类型 ( 0a98ec ) - 正确处理单参数映射器( d7bf6a )
- 在 PHPStan 扩展中处理不带参数的树映射器调用 ( 3f3a01 )
- 在 Psalm 插件 ( b425af ) 中处理不带参数的树映射器调用