feat(xml): 增加了 xml 生成的方法及测试用例

This commit is contained in:
李东云
2023-04-11 16:00:39 +08:00
parent db31689f66
commit 90a521f90a
6 changed files with 689 additions and 429 deletions

2
.idea/HDK-Core.iml generated
View File

@@ -147,8 +147,10 @@
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/guzzle" /> <excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/guzzle" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/http-foundation" /> <excludeFolder url="file://$MODULE_DIR$/vendor/symfony/http-foundation" />
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/collection" /> <excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/collection" />
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/db" />
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/pipeline" /> <excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/pipeline" />
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/tappable" /> <excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/tappable" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/serializer" />
</content> </content>
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />

2
.idea/php.xml generated
View File

@@ -165,6 +165,8 @@
<path value="$PROJECT_DIR$/vendor/hyperf/pipeline" /> <path value="$PROJECT_DIR$/vendor/hyperf/pipeline" />
<path value="$PROJECT_DIR$/vendor/hyperf/collection" /> <path value="$PROJECT_DIR$/vendor/hyperf/collection" />
<path value="$PROJECT_DIR$/vendor/hyperf/tappable" /> <path value="$PROJECT_DIR$/vendor/hyperf/tappable" />
<path value="$PROJECT_DIR$/vendor/hyperf/db" />
<path value="$PROJECT_DIR$/vendor/symfony/serializer" />
</include_path> </include_path>
</component> </component>
<component name="PhpProjectSharedConfiguration" php_language_level="8.0" /> <component name="PhpProjectSharedConfiguration" php_language_level="8.0" />

View File

@@ -25,7 +25,6 @@
"hyperf/context": "^3.0.0", "hyperf/context": "^3.0.0",
"hyperf/di": "^3.0.0", "hyperf/di": "^3.0.0",
"hyperf/framework": "^3.0.0", "hyperf/framework": "^3.0.0",
"hyperf/http-server": "3.0.*",
"hyperf/logger": "^3.0.0", "hyperf/logger": "^3.0.0",
"hyperf/redis": "^3.0.0", "hyperf/redis": "^3.0.0",
"hyperf/resource": "^3.0.0", "hyperf/resource": "^3.0.0",
@@ -39,11 +38,15 @@
"teapot/status-code": "^1.1" "teapot/status-code": "^1.1"
}, },
"require-dev": { "require-dev": {
"ext-dom": "*",
"ext-libxml": "*",
"alibabacloud/dysmsapi-20170525": "^2.0", "alibabacloud/dysmsapi-20170525": "^2.0",
"firebase/php-jwt": "^6.1", "firebase/php-jwt": "^6.1",
"friendsofphp/php-cs-fixer": "^3.13", "friendsofphp/php-cs-fixer": "^3.13",
"guzzlehttp/guzzle": "^7.5", "guzzlehttp/guzzle": "^7.5",
"hyperf/crontab": "^3.0.0", "hyperf/crontab": "^3.0.0",
"hyperf/database": "^3.0.0",
"hyperf/db": "^3.0.0",
"hyperf/guzzle": "^3.0.0", "hyperf/guzzle": "^3.0.0",
"hyperf/session": "^3.0.0", "hyperf/session": "^3.0.0",
"hyperf/validation": "^3.0.0", "hyperf/validation": "^3.0.0",
@@ -54,13 +57,15 @@
"spatie/pest-plugin-test-time": "^1.1", "spatie/pest-plugin-test-time": "^1.1",
"swoole/ide-helper": "*", "swoole/ide-helper": "*",
"symfony/mailer": "^6.0", "symfony/mailer": "^6.0",
"hyperf/database": "^3.0.0", "symfony/serializer": "^6.0"
"hyperf/db": "^3.0.0"
}, },
"suggest": { "suggest": {
"firebase/php-jwt": "JWT 鉴权必需", "firebase/php-jwt": "JWT 鉴权必需",
"hyperf/session": "^3.0.0", "hyperf/session": "^3.0.0",
"symfony/mailer": "用于发送电子邮件", "symfony/mailer": "用于发送电子邮件",
"symfony/serializer": "处理 XML 必需",
"ext-dom": "处理 XML 必需",
"ext-libxml": "处理 XML 必需",
"hyperf/guzzle": "^3.0.0", "hyperf/guzzle": "^3.0.0",
"alibabacloud/dysmsapi-20170525": "阿里云短信服务必需" "alibabacloud/dysmsapi-20170525": "阿里云短信服务必需"
}, },

930
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,72 @@
<?php
/**
* XmlService.php@LuxOP
*
* @author 李东云 <Dongyun.Li@LuxCreo.Ai>
* Powered by PhpStorm
* Created on 2023/4/10
*/
namespace Singularity\HDK\Core\Service;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
class XmlService
{
private XmlEncoder $service;
public function __construct(XmlEncoder $encoder)
{
$this->service = $encoder;
}
/**
* @param object|array<string, mixed> $data
* @param string $xmlRootNodeName
* @param bool $xmlFormatOutput 是否格式化
* @param string $xmlVersion
* @param string $xmlEncoding
* @param bool $xmlStandalone 是否添加声明规范的标签到xml
* @param bool $xmlTypeCastAttributes
* @param bool $asCollection
* @param int[] $decoderIgnoredNodeTypes
* @param int[] $encoderIgnoredNodeTypes
* @param int $loadOptions
* @param bool $removeEmptyTags
*
* @return false|string
* @see https://symfony.com/doc/current/components/serializer.html#the-xmlencoder
*/
public function encode(
object|array $data,
string $xmlRootNodeName = 'root',
bool $xmlFormatOutput = true,
string $xmlVersion = '1.0',
string $xmlEncoding = 'utf-8',
bool $xmlStandalone = false,
bool $xmlTypeCastAttributes = true,
bool $asCollection = true,
array $decoderIgnoredNodeTypes = [XML_PI_NODE, XML_COMMENT_NODE],
array $encoderIgnoredNodeTypes = [],
int $loadOptions = LIBXML_NONET | LIBXML_NOBLANKS,
bool $removeEmptyTags = false
): false|string {
return $this->service->encode(
$data,
XmlEncoder::FORMAT,
[
XmlEncoder::FORMAT_OUTPUT => $xmlFormatOutput,
XmlEncoder::VERSION => $xmlVersion,
XmlEncoder::ENCODING => $xmlEncoding,
XmlEncoder::STANDALONE => $xmlStandalone,
XmlEncoder::TYPE_CAST_ATTRIBUTES => $xmlTypeCastAttributes,
XmlEncoder::ROOT_NODE_NAME => $xmlRootNodeName,
XmlEncoder::AS_COLLECTION => $asCollection,
XmlEncoder::DECODER_IGNORED_NODE_TYPES => $decoderIgnoredNodeTypes,
XmlEncoder::ENCODER_IGNORED_NODE_TYPES => $encoderIgnoredNodeTypes,
XmlEncoder::LOAD_OPTIONS => $loadOptions,
XmlEncoder::REMOVE_EMPTY_TAGS => $removeEmptyTags,
]
);
}
}

View File

@@ -0,0 +1,101 @@
<?php
/**
* XmlServiceTest.php@LuxOP
*
* @author 李东云 <Dongyun.Li@LuxCreo.Ai>
* Powered by PhpStorm
* Created on 2023/4/10
*/
namespace HyperfTest\Unit\Common;
use Singularity\HDK\Core\Service\XmlService;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
$service = new XmlService(new XmlEncoder());
test(
'assert Xml can be encoded',
function (array $data, string $expect, string $rootNodeName) use ($service) {
$result = $service->encode($data, $rootNodeName);
expect($result)->toBe($expect);
}
)->with([
'normal' => [
'data' => [
'@version' => '1.0',
'@descripe' => 'Luxcreo',
'UserName' => 'zhm',
'Email' => 'haimei.zheng@luxcreo.ai',
'BiosId' => '420036H32020120279',
'validTime' => '2099/03/27',
],
'expect' => <<<'XML'
<?xml version="1.0" encoding="utf-8"?>
<ClientInfo version="1.0" descripe="Luxcreo">
<UserName>zhm</UserName>
<Email>haimei.zheng@luxcreo.ai</Email>
<BiosId>420036H32020120279</BiosId>
<validTime>2099/03/27</validTime>
</ClientInfo>
XML
,
'xmlRootNodeName' => 'ClientInfo',
],
'normal attribute' => [
'data' => [
'@version' => '1.0',
'@descripe' => 'Luxcreo',
'UserName' => 'zhm',
'Email' => [
'@type' => 'Business',
'#' => 'haimei.zheng@luxcreo.ai',
],
'BiosId' => '420036H32020120279',
'validTime' => '2099/03/27',
],
'expect' => <<<'XML'
<?xml version="1.0" encoding="utf-8"?>
<ClientInfo version="1.0" descripe="Luxcreo">
<UserName>zhm</UserName>
<Email type="Business">haimei.zheng@luxcreo.ai</Email>
<BiosId>420036H32020120279</BiosId>
<validTime>2099/03/27</validTime>
</ClientInfo>
XML
,
'ClientInfo',
],
'normal comment' => [
'data' => [
'@version' => '1.0',
'@descripe' => 'Luxcreo',
'UserName' => 'zhm',
'Email' => [
'@type' => 'Business',
'#' => 'haimei.zheng@luxcreo.ai',
],
'BiosId' => '420036H32020120279',
'validTime' => [
'#comment' => '到期时间',
],
],
'expect' => <<<'XML'
<?xml version="1.0" encoding="utf-8"?>
<ClientInfo version="1.0" descripe="Luxcreo">
<UserName>zhm</UserName>
<Email type="Business">haimei.zheng@luxcreo.ai</Email>
<BiosId>420036H32020120279</BiosId>
<validTime>
<!--到期时间-->
</validTime>
</ClientInfo>
XML
,
'ClientInfo',
],
]);