mirror of
http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore.git
synced 2026-01-15 07:15:06 +08:00
Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
200a98293a | ||
|
|
be818b7080 | ||
|
|
d22bd3ee58 | ||
|
|
0f9cae0288 | ||
|
|
0247dd415c | ||
|
|
77f3141c56 | ||
|
|
2a59a51f8b | ||
|
|
5e5792b28c | ||
|
|
a6b71dbb03 |
7
.idea/HDK-Core.iml
generated
7
.idea/HDK-Core.iml
generated
@@ -151,6 +151,13 @@
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/pipeline" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/tappable" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/serializer" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/code-parser" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/codec" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/conditionable" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/coroutine" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/serializer" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/stringable" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/support" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
|
||||
2
.idea/inspectionProfiles/Project_Default.xml
generated
2
.idea/inspectionProfiles/Project_Default.xml
generated
@@ -1,9 +1,7 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="PhpCSFixerValidationInspection" enabled="true" level="WEAK WARNING" enabled_by_default="true" />
|
||||
<inspection_tool class="PhpDocSignatureInspection" enabled="true" level="INFORMATION" enabled_by_default="true" />
|
||||
<inspection_tool class="PhpPropertyOnlyWrittenInspection" enabled="false" level="WARNING" enabled_by_default="false" />
|
||||
<inspection_tool class="PhpStanGlobal" enabled="true" level="WEAK WARNING" enabled_by_default="true" />
|
||||
</profile>
|
||||
</component>
|
||||
8
.idea/php.xml
generated
8
.idea/php.xml
generated
@@ -167,6 +167,14 @@
|
||||
<path value="$PROJECT_DIR$/vendor/hyperf/tappable" />
|
||||
<path value="$PROJECT_DIR$/vendor/hyperf/db" />
|
||||
<path value="$PROJECT_DIR$/vendor/symfony/serializer" />
|
||||
<path value="$PROJECT_DIR$/vendor/facade/ignition-contracts" />
|
||||
<path value="$PROJECT_DIR$/vendor/hyperf/serializer" />
|
||||
<path value="$PROJECT_DIR$/vendor/hyperf/code-parser" />
|
||||
<path value="$PROJECT_DIR$/vendor/hyperf/coroutine" />
|
||||
<path value="$PROJECT_DIR$/vendor/hyperf/conditionable" />
|
||||
<path value="$PROJECT_DIR$/vendor/hyperf/codec" />
|
||||
<path value="$PROJECT_DIR$/vendor/hyperf/stringable" />
|
||||
<path value="$PROJECT_DIR$/vendor/hyperf/support" />
|
||||
</include_path>
|
||||
</component>
|
||||
<component name="PhpProjectSharedConfiguration" php_language_level="8.0" />
|
||||
|
||||
36
CHANGELOG.md
36
CHANGELOG.md
@@ -1,4 +1,40 @@
|
||||
# 版本更新日志
|
||||
### [0.2.17](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/compare/v0.2.16...v0.2.17) (2023-05-06)
|
||||
|
||||
|
||||
### 📦 Build System | 打包构建
|
||||
|
||||
* **composer:** 更新依赖 ([d22bd3e](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/d22bd3ee587f7799b33a28015c148e50afe79107))
|
||||
|
||||
|
||||
### ✨ Features | 新功能
|
||||
|
||||
* **xml:** 实现了解析xml的方法 ([be818b7](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/be818b708011bb05a65752380248c8307938d110))
|
||||
|
||||
### [0.2.16](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/compare/v0.2.15...v0.2.16) (2023-04-25)
|
||||
|
||||
|
||||
### 🐛 Bug Fixes | Bug 修复
|
||||
|
||||
* **extend:** 修复未传入 extends 不存在缺省值的问题 ([77f3141](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/77f3141c56a09905e0c357c1b183c1c8831c9acd))
|
||||
|
||||
|
||||
### ✨ Features | 新功能
|
||||
|
||||
* **handler:** 补全了各种错误的状态码 ([0247dd4](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/0247dd415c2a62c21b5a6fbb15ab1e6ce3d1a316))
|
||||
|
||||
### [0.2.15](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/compare/v0.2.14...v0.2.15) (2023-04-13)
|
||||
|
||||
|
||||
### 🐛 Bug Fixes | Bug 修复
|
||||
|
||||
* **coreMiddleware:** 修复restful 无法分页的问题 ([a6b71db](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/a6b71dbb037624ac69eddc1e5b1d671ab45b06ae))
|
||||
|
||||
|
||||
### ✨ Features | 新功能
|
||||
|
||||
* 默认绑定 CoreMiddleware 的映射关系 ([5e5792b](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/5e5792b28ca13cc8833280ba3d26ec588c445350))
|
||||
|
||||
### [0.2.14](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/compare/v0.2.13...v0.2.14) (2023-04-12)
|
||||
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
0.2.14
|
||||
0.2.17
|
||||
@@ -20,36 +20,36 @@
|
||||
"ext-swoole": "*",
|
||||
"composer/composer": ">=2.0",
|
||||
"ergebnis/http-method": "^2.2",
|
||||
"hyperf/config": "^3.0.0",
|
||||
"hyperf/constants": "^3.0.0",
|
||||
"hyperf/context": "^3.0.0",
|
||||
"hyperf/di": "^3.0.0",
|
||||
"hyperf/framework": "^3.0.0",
|
||||
"hyperf/logger": "^3.0.0",
|
||||
"hyperf/redis": "^3.0.0",
|
||||
"hyperf/resource": "^3.0.0",
|
||||
"hyperf/translation": "^3.0.0",
|
||||
"hyperf/config": "^3.0.18",
|
||||
"hyperf/constants": "^3.0.18",
|
||||
"hyperf/context": "^3.0.18",
|
||||
"hyperf/di": "^3.0.18",
|
||||
"hyperf/framework": "^3.0.18",
|
||||
"hyperf/logger": "^3.0.18",
|
||||
"hyperf/redis": "^3.0.18",
|
||||
"hyperf/resource": "^3.0.18",
|
||||
"hyperf/translation": "^3.0.18",
|
||||
"jetbrains/phpstorm-attributes": "^1.0",
|
||||
"lmc/http-constants": "^1.2",
|
||||
"myclabs/php-enum": "^1.8",
|
||||
"roave/dont": "^1.5",
|
||||
"symfony/http-foundation": "^6.0",
|
||||
"symfony/polyfill-php81": "^1.26",
|
||||
"teapot/status-code": "^1.1"
|
||||
"teapot/status-code": "^1.1",
|
||||
"ext-libxml": "*",
|
||||
"ext-dom": "*"
|
||||
},
|
||||
"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",
|
||||
"hyperf/crontab": "^3.0.18",
|
||||
"hyperf/database": "^3.0.18",
|
||||
"hyperf/db": "^3.0.18",
|
||||
"hyperf/guzzle": "^3.0.18",
|
||||
"hyperf/session": "^3.0.18",
|
||||
"hyperf/validation": "^3.0.18",
|
||||
"pestphp/pest": "^1.22",
|
||||
"phpstan/phpstan": "^1.9",
|
||||
"phpunit/phpunit": "^9.5",
|
||||
@@ -61,12 +61,12 @@
|
||||
},
|
||||
"suggest": {
|
||||
"firebase/php-jwt": "JWT 鉴权必需",
|
||||
"hyperf/session": "^3.0.0",
|
||||
"hyperf/session": "^3.0.18",
|
||||
"symfony/mailer": "用于发送电子邮件",
|
||||
"symfony/serializer": "处理 XML 必需",
|
||||
"ext-dom": "处理 XML 必需",
|
||||
"ext-libxml": "处理 XML 必需",
|
||||
"hyperf/guzzle": "^3.0.0",
|
||||
"hyperf/guzzle": "^3.0.18",
|
||||
"alibabacloud/dysmsapi-20170525": "阿里云短信服务必需"
|
||||
},
|
||||
"config": {
|
||||
@@ -111,5 +111,5 @@
|
||||
"url": "https://mirrors.cloud.tencent.com/composer/"
|
||||
}
|
||||
},
|
||||
"version": "0.2.14"
|
||||
"version": "0.2.17"
|
||||
}
|
||||
|
||||
813
composer.lock
generated
813
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -14,8 +14,10 @@ namespace Singularity\HDK\Core;
|
||||
|
||||
use Hyperf\Contract\StdoutLoggerInterface;
|
||||
use Hyperf\Framework\Logger\StdoutLogger;
|
||||
use Hyperf\HttpServer\Contract\CoreMiddlewareInterface;
|
||||
use Singularity\HDK\Core\Listener\EmailWillSentListener;
|
||||
use Singularity\HDK\Core\Listener\SmsWillSentListener;
|
||||
use Singularity\HDK\Core\Middleware\CommonCoreMiddleware;
|
||||
|
||||
class ConfigProvider
|
||||
{
|
||||
@@ -27,6 +29,7 @@ class ConfigProvider
|
||||
// 合并到 config/autoload/dependencies.php 文件
|
||||
'dependencies' => [
|
||||
StdoutLoggerInterface::class => StdoutLogger::class,
|
||||
CoreMiddlewareInterface::class => CommonCoreMiddleware::class
|
||||
],
|
||||
// 合并到 config/autoload/annotations.php 文件
|
||||
'annotations' => [
|
||||
|
||||
@@ -12,6 +12,7 @@ declare(strict_types=1);
|
||||
|
||||
namespace Singularity\HDK\Core\Exceptions\Handler;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Hyperf\Database\Exception\QueryException;
|
||||
use Hyperf\Database\Model\ModelNotFoundException;
|
||||
use Hyperf\Di\Annotation\Inject;
|
||||
@@ -31,7 +32,6 @@ 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;
|
||||
@@ -57,6 +57,7 @@ class CommonHandler extends ExceptionHandler
|
||||
*/
|
||||
#[Inject]
|
||||
private StdoutLogger $logger;
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@@ -69,9 +70,12 @@ class CommonHandler extends ExceptionHandler
|
||||
$message_name = config('common.response.message_name');
|
||||
$is_testing = config('app_status') === true;
|
||||
$this->request?->url();
|
||||
$is_debug = $this->request?->hasHeader('Postman-Token') || str_starts_with($this->request?->header('User-Agent', ''), 'apifox');
|
||||
$is_debug = $this->request?->hasHeader('Postman-Token') || str_starts_with(
|
||||
$this->request?->header('User-Agent', ''),
|
||||
'apifox'
|
||||
);
|
||||
$error_type = $throwable::class;
|
||||
$request_time = date('Y-m-d H:i:s');
|
||||
$request_time = Carbon::now()->toDateTimeString();
|
||||
$request_data = Json::encode($this->request?->getParsedBody());
|
||||
$request_headers = Json::encode($this->request?->getHeaders());
|
||||
// 901 程序语法错误
|
||||
@@ -81,7 +85,10 @@ class CommonHandler extends ExceptionHandler
|
||||
'42S22' => CommonErrorCode::PROGRAM_SQL_COLUMN_NOT_FOUND,
|
||||
default => CommonErrorCode::PROGRAM_SQL_ERROR,
|
||||
};
|
||||
$data = [$code_name => $code, $message_name => CommonErrorCode::getMessage($is_testing ? $code : CommonErrorCode::PROGRAM_SQL_ERROR)];
|
||||
$data = [
|
||||
$code_name => $code,
|
||||
$message_name => CommonErrorCode::getMessage($is_testing ? $code : CommonErrorCode::PROGRAM_SQL_ERROR),
|
||||
];
|
||||
if ($is_testing) {
|
||||
$data['details'] = ['sql' => $throwable->getSql(), 'error' => $throwable->getMessage()];
|
||||
}
|
||||
@@ -91,27 +98,48 @@ class CommonHandler extends ExceptionHandler
|
||||
$message = explode(': ', $throwable->getMessage());
|
||||
$allow_method = explode(', ', $message[1]);
|
||||
$code = CommonErrorCode::REQUEST_METHOD_ERROR;
|
||||
$data = [$code_name => $code, $message_name => CommonErrorCode::getMessage($code, ['methods' => join(', ', $allow_method)]), 'currentMethod' => $this->request?->getMethod(), 'allowedMethod' => $allow_method];
|
||||
$data = [
|
||||
$code_name => $code,
|
||||
$message_name => CommonErrorCode::getMessage($code, ['methods' => join(', ', $allow_method)]),
|
||||
'currentMethod' => $this->request?->getMethod(),
|
||||
'allowedMethod' => $allow_method,
|
||||
];
|
||||
$status_code = RFC7231::METHOD_NOT_ALLOWED;
|
||||
}
|
||||
// 验证失败
|
||||
if ($throwable instanceof BadRequestHttpException) {
|
||||
$data = [
|
||||
$code_name => CommonErrorCode::REQUEST_PARAMS_ERROR,
|
||||
$message_name => $is_testing ? $throwable->getMessage() : CommonErrorCode::getMessage(
|
||||
CommonErrorCode::SERVER_ERROR
|
||||
),
|
||||
];
|
||||
$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;
|
||||
$code = (int)$data;
|
||||
$data = CommonErrorCode::getMessage($code);
|
||||
}
|
||||
$data = [$code_name => $code ?? CommonErrorCode::REQUEST_PARAMS_ERROR, $message_name => $data];
|
||||
$status_code = RFC4918::UNPROCESSABLE_ENTITY;
|
||||
}
|
||||
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];
|
||||
$data = [
|
||||
$code_name => $code,
|
||||
$message_name => empty($message)
|
||||
? CommonErrorCode::getMessage(
|
||||
$code,
|
||||
[
|
||||
'param' => $throwable->getFieldName(),
|
||||
]
|
||||
)
|
||||
: $message,
|
||||
];
|
||||
if ($is_debug) {
|
||||
$data['currentValue'] = $throwable->getCurrentValue();
|
||||
$data['availableValue'] = $throwable->getAvailableValue();
|
||||
@@ -126,7 +154,8 @@ class CommonHandler extends ExceptionHandler
|
||||
// 模型不存在
|
||||
if ($throwable instanceof ModelNotFoundException) {
|
||||
$code = empty($throwable->getCode()) ? CommonErrorCode::MODEL_NOT_FOUND : $throwable->getCode();
|
||||
$message = empty($throwable->getCode()) ? CommonErrorCode::getMessage($code, ['resource' => '资源']) : $throwable->getMessage();
|
||||
$message = empty($throwable->getCode()) ? CommonErrorCode::getMessage($code, ['resource' => '资源']
|
||||
) : $throwable->getMessage();
|
||||
$data = [$code_name => $code, $message_name => $message];
|
||||
$status_code = RFC7231::NOT_FOUND;
|
||||
}
|
||||
@@ -137,7 +166,12 @@ class CommonHandler extends ExceptionHandler
|
||||
if ($throwable->getMessage() === 'Connection refused') {
|
||||
$code = CommonErrorCode::SERVER_CACHE_REDIS_REFUSED_ERROR;
|
||||
}
|
||||
$data = [$code_name => $code, $message_name => CommonErrorCode::getMessage($is_testing ? $code : CommonErrorCode::SERVER_CACHE_REDIS_ERROR)];
|
||||
$data = [
|
||||
$code_name => $code,
|
||||
$message_name => CommonErrorCode::getMessage(
|
||||
$is_testing ? $code : CommonErrorCode::SERVER_CACHE_REDIS_ERROR
|
||||
),
|
||||
];
|
||||
}
|
||||
// 306 消息异常
|
||||
// 30601 邮箱发件异常
|
||||
@@ -146,14 +180,29 @@ class CommonHandler extends ExceptionHandler
|
||||
if (strpos($throwable->getMessage(), '500 Error: bad syntax')) {
|
||||
$code = CommonErrorCode::SERVER_MESSAGE_EMAIL_NOT_FOUND;
|
||||
}
|
||||
$data = [$code_name => $code, $message_name => CommonErrorCode::getMessage($is_testing ? $code : CommonErrorCode::SERVER_MESSAGE_EMAIL_ERROR)];
|
||||
$data = [
|
||||
$code_name => $code,
|
||||
$message_name => CommonErrorCode::getMessage(
|
||||
$is_testing ? $code : CommonErrorCode::SERVER_MESSAGE_EMAIL_ERROR
|
||||
),
|
||||
];
|
||||
}
|
||||
if (empty($data)) {
|
||||
// 其他情况
|
||||
$data = [$code_name => $is_testing ? $throwable->getCode() == 0 ? CommonErrorCode::SERVER_ERROR : $throwable->getCode() : CommonErrorCode::SERVER_ERROR, $message_name => $is_testing ? $throwable->getMessage() : __(CommonErrorCode::getMessage(CommonErrorCode::SERVER_ERROR))];
|
||||
$data = [
|
||||
$code_name => $is_testing ? $throwable->getCode(
|
||||
) == 0 ? CommonErrorCode::SERVER_ERROR : $throwable->getCode() : CommonErrorCode::SERVER_ERROR,
|
||||
$message_name => $is_testing ? $throwable->getMessage() : __(
|
||||
CommonErrorCode::getMessage(CommonErrorCode::SERVER_ERROR)
|
||||
),
|
||||
];
|
||||
// 其他错误
|
||||
if ($throwable instanceof HttpException) {
|
||||
$data = [$code_name => $throwable->getCode() ?: $throwable->getStatusCode(), $message_name => $throwable->getMessage()];
|
||||
$data = [
|
||||
$code_name => $throwable->getCode() ?: $throwable->getStatusCode(),
|
||||
$message_name => $throwable->getMessage(),
|
||||
];
|
||||
$status_code = $throwable->getStatusCode();
|
||||
}
|
||||
}
|
||||
$response = $response->withHeader(Header::CONTENT_TYPE, 'application/json; charset=utf-8');
|
||||
@@ -164,7 +213,7 @@ class CommonHandler extends ExceptionHandler
|
||||
$this->logger->error(
|
||||
<<<ERROR_LOG
|
||||
TYPE: {$error_type}
|
||||
[{$data[$code_name]}] {$data[$message_name]}
|
||||
[$data[$code_name]] $data[$message_name]
|
||||
{$throwable->getMessage()}
|
||||
-------------------------------
|
||||
REQUEST_TIME: {$request_time}
|
||||
@@ -195,10 +244,13 @@ ERROR_LOG
|
||||
);
|
||||
$data = Json::encode($data);
|
||||
if ($restful) {
|
||||
$response = $response->withStatus($status_code ?? $throwable->status ?? $throwable->statusCode ?? RFC7231::INTERNAL_SERVER_ERROR);
|
||||
$response = $response->withStatus(
|
||||
$status_code ?? $throwable->status ?? $throwable->statusCode ?? RFC7231::INTERNAL_SERVER_ERROR
|
||||
);
|
||||
}
|
||||
return $response->withBody(new SwooleStream($data));
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断该异常处理器是否要对该异常进行处理.
|
||||
*/
|
||||
|
||||
@@ -73,11 +73,12 @@ class CommonCoreMiddleware extends CoreMiddleware
|
||||
'last'
|
||||
);
|
||||
$fact_response = $this->utilsService->extendLinkToHeader($fact_response, $response->url(1), 'first');
|
||||
return $this->utilsService->extendLinkToHeader(
|
||||
$fact_response = $this->utilsService->extendLinkToHeader(
|
||||
$fact_response,
|
||||
$response->previousPageUrl(),
|
||||
'prev'
|
||||
);
|
||||
return $fact_response->withBody(new SwooleStream(Json::encode($response->items())));
|
||||
}
|
||||
|
||||
return parent::transferToResponse($response, $request);
|
||||
|
||||
@@ -24,13 +24,10 @@ class ExtendService
|
||||
array|string|null $params = null
|
||||
): array {
|
||||
$params ??= $request?->getQueryParams();
|
||||
$extends = $params['extends'] ?? null;
|
||||
if (!empty($extends)) {
|
||||
$extends = explode(',', $extends);
|
||||
return Context::set(self::class, array_map('trim', $extends));
|
||||
}
|
||||
$extends = explode(',', $params['extends'] ?? '');
|
||||
$extends = array_map('trim', $extends);
|
||||
|
||||
return [];
|
||||
return Context::set(self::class, array_filter($extends));
|
||||
}
|
||||
|
||||
|
||||
@@ -57,6 +54,6 @@ class ExtendService
|
||||
*/
|
||||
public function hasExtend(string $field): bool
|
||||
{
|
||||
return $this->utils->inArray($field, Context::get(self::class));
|
||||
return $this->utils->inArray($field, Context::get(self::class) ?? []);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,13 +27,8 @@ class XmlService
|
||||
* @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
|
||||
*/
|
||||
@@ -44,29 +39,48 @@ class XmlService
|
||||
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
|
||||
bool $removeEmptyTags = false,
|
||||
): false|string {
|
||||
return $this->service->encode(
|
||||
$data,
|
||||
XmlEncoder::FORMAT,
|
||||
[
|
||||
XmlEncoder::ENCODER_IGNORED_NODE_TYPES => $encoderIgnoredNodeTypes,
|
||||
XmlEncoder::ROOT_NODE_NAME => $xmlRootNodeName,
|
||||
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,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $xml
|
||||
* @param bool $xmlTypeCastAttributes 是否自动转换类型
|
||||
* @param bool $asCollection 是否全部使用数组
|
||||
* @param int[] $decoderIgnoredNodeTypes
|
||||
* @param int $loadOptions
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
public function decode(
|
||||
string $xml,
|
||||
bool $xmlTypeCastAttributes = true,
|
||||
bool $asCollection = false,
|
||||
array $decoderIgnoredNodeTypes = [XML_PI_NODE, XML_COMMENT_NODE],
|
||||
int $loadOptions = LIBXML_NONET | LIBXML_NOBLANKS,
|
||||
): array {
|
||||
return $this->service->decode(
|
||||
$xml,
|
||||
XmlEncoder::FORMAT,
|
||||
[
|
||||
XmlEncoder::LOAD_OPTIONS => $loadOptions,
|
||||
XmlEncoder::DECODER_IGNORED_NODE_TYPES => $decoderIgnoredNodeTypes,
|
||||
XmlEncoder::TYPE_CAST_ATTRIBUTES => $xmlTypeCastAttributes,
|
||||
XmlEncoder::AS_COLLECTION => $asCollection,
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,12 +9,10 @@
|
||||
|
||||
namespace Singularity\HDK\Test\Core\Unit;
|
||||
|
||||
use Hyperf\Context\Context;
|
||||
use Singularity\HDK\Core\Service\ExtendService;
|
||||
use Singularity\HDK\Core\Service\UtilsService;
|
||||
|
||||
$service = new ExtendService(new UtilsService());
|
||||
|
||||
|
||||
/** @var ExtendService $service */
|
||||
$service = make(ExtendService::class, ['utils' => new UtilsService()]);
|
||||
it('asserts no parameters can be parsed.', function (ExtendService $service, $params) {
|
||||
@@ -23,7 +21,7 @@ it('asserts no parameters can be parsed.', function (ExtendService $service, $pa
|
||||
$params
|
||||
);
|
||||
$result = $service->getExtends();
|
||||
expect($result)->toBeArray()->toHaveCount(0)->toBe([]);
|
||||
expect($result)->toBeArray()->toBe([])->toHaveCount(0)->toBe([]);
|
||||
})->with([
|
||||
[$service, null],
|
||||
[$service, ''],
|
||||
@@ -32,6 +30,11 @@ it('asserts no parameters can be parsed.', function (ExtendService $service, $pa
|
||||
[$service, ['extends' => null]],
|
||||
]);
|
||||
|
||||
it('asserts has no specify extend', function () use ($service) {
|
||||
Context::destroy(ExtendService::class);
|
||||
expect($service->hasExtend('a'))->toBeFalse();
|
||||
})->depends('it asserts query parameters can be parsed.');
|
||||
|
||||
it('asserts query parameters can be parsed.', function () use ($service) {
|
||||
$result = $service->parse(
|
||||
null,
|
||||
@@ -44,19 +47,21 @@ it('asserts query parameters can be parsed.', function () use ($service) {
|
||||
});
|
||||
|
||||
it('asserts has extends', function () use ($service) {
|
||||
Context::set(ExtendService::class, ['a', 'b']);
|
||||
expect($service->hasExtends())->toBeTrue();
|
||||
});
|
||||
|
||||
it('asserts has specify extend', function () use ($service) {
|
||||
Context::set(ExtendService::class, ['a', 'b']);
|
||||
expect($service->hasExtend('a'))->toBeTrue()
|
||||
->and($service->hasExtend('b'))->toBeTrue()
|
||||
->and($service->hasExtend('c'))->toBeFalse();
|
||||
})->depends('it asserts query parameters can be parsed.');
|
||||
|
||||
it('asserts parsed extends', function () use ($service) {
|
||||
$extends = $service->getExtends();
|
||||
expect($extends)->toBeArray()->toMatchArray([
|
||||
'a',
|
||||
'b',
|
||||
]);
|
||||
})->depends('it asserts query parameters can be parsed.');
|
||||
// it('asserts parsed extends', function () use ($service) {
|
||||
// $extends = $service->getExtends();
|
||||
// expect($extends)->toBeArray()->toMatchArray([
|
||||
// 'a',
|
||||
// 'b',
|
||||
// ]);
|
||||
// })->depends('it asserts query parameters can be parsed.');
|
||||
|
||||
@@ -12,7 +12,13 @@ namespace HyperfTest\Unit\Common;
|
||||
use Singularity\HDK\Core\Service\XmlService;
|
||||
use Symfony\Component\Serializer\Encoder\XmlEncoder;
|
||||
|
||||
$service = new XmlService(new XmlEncoder());
|
||||
use function Hyperf\Support\make;
|
||||
|
||||
/** @var XmlService $service */
|
||||
$service = make(
|
||||
XmlService::class,
|
||||
['encoder' => make(XmlEncoder::class)]
|
||||
);
|
||||
|
||||
test(
|
||||
'assert Xml can be encoded',
|
||||
@@ -40,8 +46,7 @@ test(
|
||||
<validTime>2099/03/27</validTime>
|
||||
</ClientInfo>
|
||||
|
||||
XML
|
||||
,
|
||||
XML,
|
||||
'xmlRootNodeName' => 'ClientInfo',
|
||||
],
|
||||
'normal attribute' => [
|
||||
@@ -99,3 +104,27 @@ XML
|
||||
'ClientInfo',
|
||||
],
|
||||
]);
|
||||
|
||||
test('assert Xml can be parsed', function (string $xml, array $expected) use ($service) {
|
||||
$data = $service->decode($xml);
|
||||
expect($data)->toBe($expected);
|
||||
})->with([
|
||||
'normal' => [
|
||||
'xml' => <<<XML
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ClientInfo version="1.0" descripe="LuxAlignAuthentication">
|
||||
<UserName>zhm</UserName>
|
||||
<Email>haimei.zheng@luxcreo.ai</Email>
|
||||
<BiosId>420036H32020120279</BiosId>
|
||||
</ClientInfo>
|
||||
|
||||
XML,
|
||||
'expected' => [
|
||||
'@version' => 1.0,
|
||||
'@descripe' => 'LuxAlignAuthentication',
|
||||
'UserName' => 'zhm',
|
||||
'Email' => 'haimei.zheng@luxcreo.ai',
|
||||
'BiosId' => '420036H32020120279',
|
||||
],
|
||||
],
|
||||
]);
|
||||
|
||||
Reference in New Issue
Block a user