跳至正文

更新日志 0.12.0 — 2022 年 7 月 10 日

重要变更

安全性——用户态异常过滤

有关更多信息,请参阅咨询 GHSA-5pgm-3j3g-2rc7 。

构造函数中抛出的用户态异常将不再被映射器自动捕获。这可以防止包含敏感信息的消息到达最终用户——例如显示查询的一部分的 SQL 异常。

为了让异常被认为是安全的,必须谨慎使用新方法MapperBuilder::filterExceptions() 。

final class SomeClass
{
    public function __construct(private string $value)
    {
        \Webmozart\Assert\Assert::startsWith($value, 'foo_');
    }
}

try {
    (new \CuyZ\Valinor\MapperBuilder())
        ->filterExceptions(function (Throwable $exception) {
            if ($exception instanceof \Webmozart\Assert\InvalidArgumentException) {
                return \CuyZ\Valinor\Mapper\Tree\Message\ThrowableMessage::from($exception);
            }

            // If the exception should not be caught by this library, it
            // must be thrown again.
            throw $exception;
        })
        ->mapper()
        ->map(SomeClass::class, 'bar_baz');
} catch (\CuyZ\Valinor\Mapper\MappingError $exception) {
    // Should print something similar to:
    // > Expected a value to start with "foo_". Got: "bar_baz"
    echo $exception->node()->messages()[0];
}

树节点 API 返工

类\CuyZ\Valinor\Mapper\Tree\Node已被重构,以删除对不属于公共 API 一部分的不需要的方法的访问。以下是所有更改的列表:

  • 新方法$node->sourceFilled()和$node->sourceValue()允许访问源值。

  • 方法$node->value()已重命名为$node->mappedValue() ,如果节点无效,则会抛出异常。

  • 方法$node->type()现在返回一个字符串。

  • 方法$message->name() 、 $message->path() 、 $message->type()和$message->value()已被弃用,取而代之的是新方法$message->node() 。

  • 消息参数{original_value}已被弃用,取而代之的是{source_value} 。

访问删除了库公共 API 的几个部分

对类/函数定义、类型和异常的访问并没有为库的实际目标增加价值。将这些功能保留在公共 API 标志下会导致更多的维护负担,而撤销它们的访问权限可以使库的整体开发更加灵活。

⚠ 重大变更

  • 过滤用户态异常以隐藏潜在的敏感数据( 6ce1a4 )
  • 重构树节点 API ( d3b1dc )
  • 从库的多个部分删除 API 访问 ( 316d91 )
  • 删除节点访问者功能( 63c87a )

错误修复

  • 正确处理同名的推断方法( dc45dd )
  • 将无效类型默认值处理为无法解析的类型( 7c9ac1 )
  • 正确显示无法解析的类型( 3020db )

其他

  • 忽略.idea文件夹 ( 84ead0 )