mirror of
http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore.git
synced 2026-01-15 05:15:07 +08:00
Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2a59a51f8b | ||
|
|
5e5792b28c | ||
|
|
a6b71dbb03 | ||
|
|
d836186296 | ||
|
|
e69c1494c3 | ||
|
|
11315aa109 | ||
|
|
90a521f90a | ||
|
|
db31689f66 | ||
|
|
7e5cb89dfe | ||
|
|
4ba0cb83f5 | ||
|
|
c25e6eed52 | ||
|
|
2ee20984ce | ||
|
|
859a1a1f2a | ||
|
|
78b56a6aa9 | ||
|
|
c991c31260 |
18
.idea/HDK-Core.iml
generated
18
.idea/HDK-Core.iml
generated
@@ -64,7 +64,6 @@
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/http-message" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/exception-handler" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/macroable" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/engine" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/pool" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/event" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/validation" />
|
||||
@@ -83,7 +82,6 @@
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phar-io/manifest" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phar-io/version" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-timer" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/phpunit" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-text-template" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-code-coverage" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-invoker" />
|
||||
@@ -138,13 +136,21 @@
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/friendsofphp/php-cs-fixer" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/filp/whoops" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/deprecations" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/paginator" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/phpunit" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/engine" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/spatie/pest-plugin-test-time" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/coordinator" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/resource" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/spatie/test-time" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/guzzle" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/coordinator" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/engine-contract" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/resource" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/vendor/hyperf/paginator" />
|
||||
<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" />
|
||||
|
||||
8
.idea/php.xml
generated
8
.idea/php.xml
generated
@@ -159,8 +159,14 @@
|
||||
<path value="$PROJECT_DIR$/vendor/doctrine/deprecations" />
|
||||
<path value="$PROJECT_DIR$/vendor/hyperf/coordinator" />
|
||||
<path value="$PROJECT_DIR$/vendor/hyperf/guzzle" />
|
||||
<path value="$PROJECT_DIR$/vendor/facade/ignition-contracts" />
|
||||
<path value="$PROJECT_DIR$/vendor/hyperf/engine-contract" />
|
||||
<path value="$PROJECT_DIR$/vendor/hyperf/crontab" />
|
||||
<path value="$PROJECT_DIR$/vendor/symfony/http-foundation" />
|
||||
<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" />
|
||||
|
||||
48
CHANGELOG.md
48
CHANGELOG.md
@@ -1,4 +1,52 @@
|
||||
# 版本更新日志
|
||||
### [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)
|
||||
|
||||
|
||||
### ✨ 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)
|
||||
|
||||
|
||||
### 📦 Build System | 打包构建
|
||||
|
||||
* **composer:** 更新依赖以兼容 nano ([7e5cb89](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/7e5cb89dfe1c09390e78cdd527c60151f2cd0418))
|
||||
* **phpstan:** fix ([c25e6ee](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/c25e6eed52e83d2ca62fc3d0cf83f508a1045c5a))
|
||||
* **scripts:** 更新脚本 ([4ba0cb8](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/4ba0cb83f5dc88817260cb2b2dfde491c6b5ba75))
|
||||
|
||||
### [0.2.11](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/compare/v0.2.10...v0.2.11) (2023-04-03)
|
||||
|
||||
|
||||
### 📦 Build System | 打包构建
|
||||
|
||||
* **composer:** 更新依赖 ([78b56a6](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/78b56a6aa9038743be7df9a17787b94771e226c3))
|
||||
* **composer:** 更新依赖 ([c991c31](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/c991c312609e7501c7adad28ec8229efad717db0))
|
||||
|
||||
|
||||
### ✨ Features | 新功能
|
||||
|
||||
* **i18n:** 引入了 symfony 的 Accept-Language 机制 ([859a1a1](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/859a1a1f2aa683f9f026652952d1a03ba5d7be02))
|
||||
|
||||
### [0.2.10](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/compare/v0.2.9...v0.2.10) (2023-03-21)
|
||||
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
0.2.10
|
||||
0.2.15
|
||||
@@ -15,50 +15,58 @@
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": "~8.0",
|
||||
"php": "^8.0",
|
||||
"ext-redis": "^5.3",
|
||||
"ext-swoole": "*",
|
||||
"composer/composer": ">=2.0",
|
||||
"ergebnis/http-method": "^2.2",
|
||||
"hyperf/config": "3.0.*",
|
||||
"hyperf/constants": "3.0.*",
|
||||
"hyperf/context": "3.0.*",
|
||||
"hyperf/database": "3.0.*",
|
||||
"hyperf/di": "3.0.*",
|
||||
"hyperf/framework": "3.0.*",
|
||||
"hyperf/http-server": "3.0.*",
|
||||
"hyperf/logger": "3.0.*",
|
||||
"hyperf/redis": "3.0.*",
|
||||
"hyperf/resource": "3.0.*",
|
||||
"hyperf/translation": "3.0.*",
|
||||
"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",
|
||||
"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"
|
||||
},
|
||||
"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/guzzle": "^3.0",
|
||||
"hyperf/session": "3.0.*",
|
||||
"hyperf/validation": "3.0.*",
|
||||
"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",
|
||||
"pestphp/pest": "^1.22",
|
||||
"phpstan/phpstan": "^1.9",
|
||||
"phpunit/phpunit": "^9.5",
|
||||
"roave/security-advisories": "dev-latest",
|
||||
"spatie/pest-plugin-test-time": "^1.1",
|
||||
"swoole/ide-helper": "*",
|
||||
"symfony/mailer": "^6.0"
|
||||
"symfony/mailer": "^6.0",
|
||||
"symfony/serializer": "^6.0"
|
||||
},
|
||||
"suggest": {
|
||||
"firebase/php-jwt": "JWT 鉴权必需",
|
||||
"hyperf/session": "Session 鉴权必需",
|
||||
"hyperf/session": "^3.0.0",
|
||||
"symfony/mailer": "用于发送电子邮件",
|
||||
"hyperf/guzzle": "需要发起 http 请求时必需",
|
||||
"symfony/serializer": "处理 XML 必需",
|
||||
"ext-dom": "处理 XML 必需",
|
||||
"ext-libxml": "处理 XML 必需",
|
||||
"hyperf/guzzle": "^3.0.0",
|
||||
"alibabacloud/dysmsapi-20170525": "阿里云短信服务必需"
|
||||
},
|
||||
"config": {
|
||||
@@ -103,5 +111,5 @@
|
||||
"url": "https://mirrors.cloud.tencent.com/composer/"
|
||||
}
|
||||
},
|
||||
"version": "0.2.10"
|
||||
"version": "0.2.15"
|
||||
}
|
||||
|
||||
1917
composer.lock
generated
1917
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -5,7 +5,7 @@ parameters:
|
||||
paths:
|
||||
- publish
|
||||
- src
|
||||
- testsi
|
||||
- tests
|
||||
ignoreErrors:
|
||||
- '#Constant BASE_PATH not found#'
|
||||
- '#Property [a-zA-Z0-9\\_]+::\$[a-zA-Z0-9]+ is never written, only read\.#'
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
#!/usr/bin/env sh
|
||||
docker login harbor.luxcreo.cn -u php -p fTr6oVvqqdzVlYgnZhRPPAP54u7SmqGA
|
||||
|
||||
image_name=harbor.luxcreo.cn/php/composer-template
|
||||
docker build --tag $image_name .
|
||||
|
||||
#docker push $image_name
|
||||
#docker push ${image_name}-dev
|
||||
@@ -6,4 +6,5 @@ docker run \
|
||||
-w "/srv/www" \
|
||||
-v "$(pwd)":/srv/www \
|
||||
-v ~/.ssh:/root/.ssh \
|
||||
-v ~/.gitconfig:/root/.gitconfig \
|
||||
harbor.luxcreo.cn/library/hyperf:8.0-swoole /bin/ash
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
docker run --rm -it \
|
||||
-v $(pwd):/app -e "GIT_AUTHOR_NAME=ch4o5" -e "EMAIL=dongyun.li@luxcreo.ai" \
|
||||
-v $(pwd):/app -e "GIT_AUTHOR_NAME=$(git config user.name)" -e "EMAIL=$(git config user.email)" \
|
||||
detouched/standard-version:latest $1
|
||||
|
||||
@@ -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' => [
|
||||
|
||||
@@ -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 缓存异常
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -7,10 +7,12 @@ namespace Singularity\HDK\Core\Middleware;
|
||||
use Hyperf\Context\Context;
|
||||
use Hyperf\Contract\TranslatorInterface;
|
||||
use Hyperf\Di\Annotation\Inject;
|
||||
use Lmc\HttpConstants\Header;
|
||||
use Psr\Http\Message\ResponseInterface;
|
||||
use Psr\Http\Message\ServerRequestInterface;
|
||||
use Psr\Http\Server\MiddlewareInterface;
|
||||
use Psr\Http\Server\RequestHandlerInterface;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
|
||||
/**
|
||||
* Singularity\HDK\Utils\Middleware\InternationalizationMiddleware@HDK
|
||||
@@ -26,13 +28,16 @@ class InternationalizationMiddleware implements MiddlewareInterface
|
||||
*/
|
||||
#[Inject]
|
||||
private TranslatorInterface $translator;
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
|
||||
{
|
||||
$response = Context::get(ResponseInterface::class);
|
||||
$language = $request->getHeaderLine('Accept-Language');
|
||||
$req = (new Request());
|
||||
$req->headers->set(Header::ACCEPT_LANGUAGE, $request->getHeaderLine(Header::ACCEPT_LANGUAGE));
|
||||
|
||||
$language = $req->getPreferredLanguage([config('translation.locale')]);
|
||||
if (!empty($language)) {
|
||||
$language = match (strtolower($language)) {
|
||||
'en', 'en_us', 'en-us', 'en-uk', 'en_uk' => 'en',
|
||||
@@ -40,9 +45,14 @@ class InternationalizationMiddleware implements MiddlewareInterface
|
||||
default => config('translation.locale'),
|
||||
};
|
||||
$this->translator->setLocale($language);
|
||||
$response = $response->withAddedHeader('Content-Language', strtr($this->translator->getLocale(), '_', '-'));
|
||||
Context::set(ResponseInterface::class, $response);
|
||||
}
|
||||
$response = Context::get(ResponseInterface::class);
|
||||
$response = $response->withAddedHeader(
|
||||
Header::CONTENT_LANGUAGE,
|
||||
strtr($this->translator->getLocale(), '_', '-')
|
||||
);
|
||||
Context::set(ResponseInterface::class, $response);
|
||||
|
||||
return $handler->handle($request);
|
||||
}
|
||||
}
|
||||
|
||||
72
src/Service/XmlService.php
Normal file
72
src/Service/XmlService.php
Normal 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,
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
101
tests/Unit/XmlServiceTest.php
Normal file
101
tests/Unit/XmlServiceTest.php
Normal 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',
|
||||
],
|
||||
]);
|
||||
Reference in New Issue
Block a user