Compare commits

...

4 Commits

Author SHA1 Message Date
李东云
d836186296 chore(release): 0.2.14 2023-04-12 09:36:26 +00:00
李东云
e69c1494c3 feat(handler): 补充 restful 响应的状态码 2023-04-12 17:36:15 +08:00
李东云
11315aa109 chore(release): 0.2.13 2023-04-11 08:17:09 +00:00
李东云
90a521f90a feat(xml): 增加了 xml 生成的方法及测试用例 2023-04-11 16:16:49 +08:00
9 changed files with 712 additions and 433 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/symfony/http-foundation" />
<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/tappable" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/serializer" />
</content>
<orderEntry type="inheritedJdk" />
<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/collection" />
<path value="$PROJECT_DIR$/vendor/hyperf/tappable" />
<path value="$PROJECT_DIR$/vendor/hyperf/db" />
<path value="$PROJECT_DIR$/vendor/symfony/serializer" />
</include_path>
</component>
<component name="PhpProjectSharedConfiguration" php_language_level="8.0" />

View File

@@ -1,4 +1,18 @@
# 版本更新日志
### [0.2.14](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/compare/v0.2.13...v0.2.14) (2023-04-12)
### ✨ Features | 新功能
* **handler:** 补充 restful 响应的状态码 ([e69c149](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/e69c1494c3ec0a8d26341f1891d7d067511e8baf))
### [0.2.13](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/compare/v0.2.12...v0.2.13) (2023-04-11)
### ✨ Features | 新功能
* **xml:** 增加了 xml 生成的方法及测试用例 ([90a521f](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/90a521f90acee7fd6efe6f0a554e749c16fadc1c))
### [0.2.12](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/compare/v0.2.11...v0.2.12) (2023-04-10)

View File

@@ -1 +1 @@
0.2.12
0.2.14

View File

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

930
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -31,6 +31,8 @@ use RedisException;
use Singularity\HDK\Core\Constants\CommonErrorCode;
use Singularity\HDK\Core\Exceptions\ValidateException;
use Symfony\Component\Mailer\Exception\TransportException;
use Teapot\StatusCode\All;
use Teapot\StatusCode\RFC\RFC4918;
use Teapot\StatusCode\RFC\RFC7231;
use Throwable;
@@ -93,9 +95,11 @@ class CommonHandler extends ExceptionHandler
}
// 验证失败
if ($throwable instanceof BadRequestHttpException) {
$status_code = RFC4918::UNPROCESSABLE_ENTITY;
$data = [$code_name => CommonErrorCode::REQUEST_PARAMS_ERROR, $message_name => $is_testing ? $throwable->getMessage() : CommonErrorCode::getMessage(CommonErrorCode::SERVER_ERROR)];
}
if ($throwable instanceof ValidationException) {
$status_code = RFC4918::UNPROCESSABLE_ENTITY;
$data = $throwable->validator->errors()->first();
if (is_numeric($data)) {
$code = (int) $data;
@@ -104,6 +108,7 @@ class CommonHandler extends ExceptionHandler
$data = [$code_name => $code ?? CommonErrorCode::REQUEST_PARAMS_ERROR, $message_name => $data];
}
if ($throwable instanceof ValidateException) {
$status_code = RFC4918::UNPROCESSABLE_ENTITY;
$code = $throwable->getCode();
$message = $throwable->getMessage();
$data = [$code_name => $code, $message_name => empty($message) ? CommonErrorCode::getMessage($code, ['param' => $throwable->getFieldName()]) : $message];
@@ -116,14 +121,14 @@ class CommonHandler extends ExceptionHandler
if ($throwable instanceof NotFoundHttpException) {
$code = CommonErrorCode::ROUTE_NOT_FOUND;
$data = [$code_name => $code, $message_name => CommonErrorCode::getMessage($code)];
$status_code = 404;
$status_code = RFC7231::NOT_FOUND;
}
// 模型不存在
if ($throwable instanceof ModelNotFoundException) {
$code = empty($throwable->getCode()) ? CommonErrorCode::MODEL_NOT_FOUND : $throwable->getCode();
$message = empty($throwable->getCode()) ? CommonErrorCode::getMessage($code, ['resource' => '资源']) : $throwable->getMessage();
$data = [$code_name => $code, $message_name => $message];
$status_code = 404;
$status_code = RFC7231::NOT_FOUND;
}
// 300 服务出错
// 303 缓存异常

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',
],
]);