endermanbugzjfc/configstruct

此包已被弃用且不再维护。作者建议使用sylvrs/libmarshal包代替。

2.1.0 2022-05-21 21:24 UTC

README

请使用https://github.com/sylvrs/libMarshal代替。

ConfigStruct

数组类型和形状系统。帮助您在实现PocketMine-MP插件或composer项目配置时编写更清晰的代码。

当数据出现问题时,它还会生成更易于阅读的错误信息。鼓励和指导用户(尤其是某些PocketMine-MP服务器所有者)阅读错误并修复其混乱。

https://github.com/Sandertv/Marshal是支持较低PHP版本的替代方案。然而,它并不像这个库那样功能丰富。

每个人都寻找的部分

安装

通过Composer

composer require endermanbugzjfc/configstruct

通过PocketMine-MP病毒感染: https://poggit.pmmp.io/v.dl/Endermanbugzjfc/ConfigStruct/ConfigStruct/%5E2.0.0

预览

解析错误

2 errors in /Users/Shoghi/Documents/shog chips.yml
    1 errors in element "a"
        1 errors in index "0"
            1 errors in element "c"
                Element is array while it should be string
    1 errors in element "b"
        Element is null while it should be bool

请注意存在一个尾随换行符。

开发者指南

解析数据

use Endermanbugzjfc\ConfigStruct\Parse;
$context = Parse::object($object, $data);
$context->copyToObject($object, $dataFilePath);

$dataFilePath如果在错误消息中,将会显示。

当调用copyToObject()时,错误将用ParseErrorsWrapper包装并抛出。尽管推荐捕获它,但您仍然可以选择忽略它。因为错误仍然可以在PHP未捕获的错误消息中良好显示。

如果您没有对象而是它的ReflectionClass实例,则可以使用Parse::objectByReflection()。并使用$context->copyToNewObject()将解析的数据复制到新对象。

自定义错误信息

更改根标题标签

/Users/Shoghi/Documents/shog chips.yml是以下错误树中的根标题标签

2 errors in /Users/Shoghi/Documents/shog chips.yml
    1 errors in element "a"
        1 errors in index "0"
            1 errors in element "c"
                Element is array while it should be string
    1 errors in element "b"
        Element is null while it should be bool

您可以在ParseErrorsWrapper::regenerateErrorMessage()的第一个参数中更改它。

$parseErrorsWrapper->regenerateErrorMessage('C:\Windows\System32\ntoskrnl.exe');

更改缩进

您可以在ParseErrorsWrapper::regenerateErrorMessage()的第二个参数中更改它。

过滤错误

您可以通过过滤来隐藏错误树中的某些错误。使用ParseErrorsWrapper::regenerateErrorMessage()的第三个参数应用错误过滤器。

$parseErrorsWrapper->regenerateErrorMessage(
    $parseErrorsWrapper->getRootHeaderLabel(),
    $parseErrorsWrapper->getIndentation(),
    fn (array $keys, BaseParseError $parseError) : bool => !$parseError instanceof TypeMismatchError
);

此功能将过滤掉所有类型不匹配错误。尽管 $parseError->getErrorsTree() 仍然会包含这些错误,但它们将不会显示在错误信息中。

打印更新后的错误信息

只需再次抛出解析错误包装器即可。或者您可以选择echo $parseErrorsWrapper->getMessage()。默认情况下,错误信息后面有一个换行符(\n)。您可以通过调用$parseErrorsWrapper->getMessageRtrim()来获取不带尾随换行符(以及其他空白字符)的错误信息。