Compare commits

...

9 Commits

Author SHA1 Message Date
李东云
3d86b05fff chore(release): 0.2.23 2023-07-07 02:13:01 +00:00
李东云
722d124e1e fix(i18n): 修复获取偏好语言失败的问题
Signed-off-by: 李东云 <dongyu.li@luxcreo.ai>
2023-07-07 10:12:35 +08:00
李东云
5702e7f913 chore(release): 0.2.22 2023-07-06 09:54:58 +00:00
李东云
a6ec6951a9 fix(service): 修复 http 请求类中无效的 query
Signed-off-by: 李东云 <dongyu.li@luxcreo.ai>
2023-07-06 17:54:46 +08:00
李东云
a52fc28901 chore(release): 0.2.21 2023-07-05 08:41:23 +00:00
李东云
2b0374bcc8 chore(deprecated): 声明弃用了 SessionMiddleware
Signed-off-by: 李东云 <dongyu.li@luxcreo.ai>
2023-07-05 16:40:38 +08:00
李东云
8616c5f61c perf: 适配已弃用的命名空间
Signed-off-by: 李东云 <dongyu.li@luxcreo.ai>
2023-06-19 18:22:42 +08:00
李东云
aee67d78fc chore(release): 0.2.20 2023-06-19 10:15:18 +00:00
李东云
8974ee595b feat(handler): 增加了 restful 的支持
Signed-off-by: 李东云 <dongyu.li@luxcreo.ai>
2023-06-19 18:15:00 +08:00
16 changed files with 182 additions and 57 deletions

View File

@@ -1,4 +1,37 @@
# 版本更新日志
### [0.2.23](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/compare/v0.2.22...v0.2.23) (2023-07-07)
### 🐛 Bug Fixes | Bug 修复
* **i18n:** 修复获取偏好语言失败的问题 ([722d124](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/722d124e1ed87c493dfb8841212b408717444d98))
### [0.2.22](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/compare/v0.2.21...v0.2.22) (2023-07-06)
### 🐛 Bug Fixes | Bug 修复
* **service:** 修复 http 请求类中无效的 query ([a6ec695](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/a6ec6951a9a68a4c5144aee97638486826d6af84))
### [0.2.21](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/compare/v0.2.20...v0.2.21) (2023-07-05)
### ⚡ Performance Improvements | 性能优化
* 适配已弃用的命名空间 ([8616c5f](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/8616c5f61cc8e69c9d61f42f5dc5d18e7c79fd7b))
### 🚀 Chore | 构建/工程依赖/工具
* **deprecated:** 声明弃用了 SessionMiddleware ([2b0374b](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/2b0374bcc83a5534358a7fce34b723e3bd38dceb))
### [0.2.20](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/compare/v0.2.19...v0.2.20) (2023-06-19)
### ✨ Features | 新功能
* **handler:** 增加了 restful 的支持 ([8974ee5](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/8974ee595b3411bac086c3046eb24ba44087ecc7))
### [0.2.19](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/compare/v0.2.18...v0.2.19) (2023-06-02)

View File

@@ -1 +1 @@
0.2.19
0.2.23

View File

@@ -111,5 +111,5 @@
"url": "https://mirrors.aliyun.com/composer/"
}
},
"version": "0.2.19"
"version": "0.2.23"
}

View File

@@ -9,6 +9,8 @@
declare(strict_types=1);
use function Hyperf\Support\env;
return [
// 响应
'response' => [

View File

@@ -7,6 +7,8 @@ use Singularity\HDK\Core\Constants\CommonErrorCode;
use Teapot\StatusCode\RFC\RFC7231;
use Throwable;
use function Hyperf\Config\config;
/**
* 用户无权访问
*/

View File

@@ -13,6 +13,7 @@ declare(strict_types=1);
namespace Singularity\HDK\Core\Exceptions\Handler;
use Carbon\Carbon;
use Hyperf\Codec\Json;
use Hyperf\Database\Exception\QueryException;
use Hyperf\Database\Model\ModelNotFoundException;
use Hyperf\Di\Annotation\Inject;
@@ -24,18 +25,21 @@ use Hyperf\HttpMessage\Exception\MethodNotAllowedHttpException;
use Hyperf\HttpMessage\Exception\NotFoundHttpException;
use Hyperf\HttpMessage\Stream\SwooleStream;
use Hyperf\HttpServer\Contract\RequestInterface;
use Hyperf\Utils\Codec\Json;
use Hyperf\Validation\ValidationException;
use Lmc\HttpConstants\Header;
use Psr\Http\Message\ResponseInterface;
use RedisException;
use Singularity\HDK\Core\Constants\CommonErrorCode;
use Singularity\HDK\Core\Exceptions\ValidateException;
use Singularity\HDK\Core\Service\ApiStyleService;
use Symfony\Component\Mailer\Exception\TransportException;
use Teapot\StatusCode\RFC\RFC4918;
use Teapot\StatusCode\RFC\RFC7231;
use Throwable;
use function Hyperf\Config\config;
use function Hyperf\Translation\__;
/**
* 通用异常处理
* Singularity\HDK\Utils\Exceptions\Handler\CommonHandler@hyperf-development-kit
@@ -46,18 +50,15 @@ use Throwable;
*/
class CommonHandler extends ExceptionHandler
{
/**
*
* @var RequestInterface|null
*/
#[Inject(required: false)]
private ?RequestInterface $request;
/**
* @var StdoutLogger
*/
#[Inject]
private StdoutLogger $logger;
#[Inject]
private ApiStyleService $apiStyleService;
/**
* {@inheritDoc}
*/
@@ -65,7 +66,8 @@ class CommonHandler extends ExceptionHandler
{
// 阻止异常冒泡
$this->stopPropagation();
$restful = config('common.response.restful');
$restful = $this->apiStyleService->get();
// $restful = config('common.response.restful');
$code_name = config('common.response.code_name');
$message_name = config('common.response.message_name');
$is_testing = config('app_status') === true;
@@ -243,7 +245,7 @@ TRACE:
ERROR_LOG
);
$data = Json::encode($data);
if ($restful) {
if ($restful === ApiStyleService::RESTFUL) {
$response = $response->withStatus(
$status_code ?? $throwable->status ?? $throwable->statusCode ?? RFC7231::INTERNAL_SERVER_ERROR
);

View File

@@ -10,18 +10,20 @@
namespace Singularity\HDK\Core\Middleware;
use Hyperf\Codec\Json;
use Hyperf\Contract\Arrayable;
use Hyperf\Contract\Jsonable;
use Hyperf\Contract\LengthAwarePaginatorInterface;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpMessage\Stream\SwooleStream;
use Hyperf\HttpServer\CoreMiddleware;
use Hyperf\Utils\Codec\Json;
use Lmc\HttpConstants\Header;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Singularity\HDK\Core\Service\UtilsService;
use function Hyperf\Config\config;
/**
* Singularity\HDK\Utils\Middleware\ClassicCoreMiddleware@hyperf-development-kit
*

View File

@@ -10,19 +10,21 @@
namespace Singularity\HDK\Core\Middleware;
use Hyperf\Codec\Json;
use Hyperf\Contract\Arrayable;
use Hyperf\Contract\Jsonable;
use Hyperf\Contract\LengthAwarePaginatorInterface;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpMessage\Stream\SwooleStream;
use Hyperf\HttpServer\CoreMiddleware;
use Hyperf\Utils\Codec\Json;
use Lmc\HttpConstants\Header;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Singularity\HDK\Core\Service\ApiStyleService;
use Singularity\HDK\Core\Service\UtilsService;
use function Hyperf\Config\config;
/**
* Singularity\HDK\Core\Middleware\CommonCoreMiddleware@HDK-Core
*

View File

@@ -14,6 +14,8 @@ use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Symfony\Component\HttpFoundation\Request;
use function Hyperf\Config\config;
/**
* Singularity\HDK\Utils\Middleware\InternationalizationMiddleware@HDK
*
@@ -37,7 +39,7 @@ class InternationalizationMiddleware implements MiddlewareInterface
$req = (new Request());
$req->headers->set(Header::ACCEPT_LANGUAGE, $request->getHeaderLine(Header::ACCEPT_LANGUAGE));
$language = $req->getPreferredLanguage([config('translation.locale')]);
$language = $req->getPreferredLanguage();
if (!empty($language)) {
$language = match (strtolower($language)) {
'en', 'en_us', 'en-us', 'en-uk', 'en_uk' => 'en',

View File

@@ -15,8 +15,11 @@ use Hyperf\Contract\SessionInterface;
use Hyperf\HttpMessage\Cookie\Cookie;
use Hyperf\HttpMessage\Server\Response;
use Hyperf\Session\SessionManager;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
/**
* Singularity\HDK\Core\Middleware\SessionMiddleware@HDK-Core
@@ -24,12 +27,70 @@ use Psr\Http\Message\ServerRequestInterface;
* @author 李东云 <Dongyun.Li@LuxCreo.Ai>
* Powered by PhpStorm
* Created on 2023/3/8
*
* @deprecated since 0.2.21, use \Singularity\HDK\Auth\Middleware\SessionMiddleware instead.
*/
class SessionMiddleware extends \Hyperf\Session\Middleware\SessionMiddleware
class SessionMiddleware implements MiddlewareInterface
{
public function __construct(private SessionManager $sessionManager, private ConfigInterface $config)
{
parent::__construct($this->sessionManager, $this->config);
}
/**
* Process an incoming server request.
* Processes an incoming server request in order to produce a response.
* If unable to produce the response itself, it may delegate to the provided
* request handler to do so.
*/
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
if (!$this->isSessionAvailable()) {
return $handler->handle($request);
}
$session = $this->sessionManager->start($request);
try {
$response = $handler->handle($request);
} finally {
$this->storeCurrentUrl($request, $session);
$session = $this->sessionManager->getSession();
/*
* 现在的机制,但凡写入 Redis 的数据,
* 过期时间就是固定的 gc_maxlifetime
*
* 而 RedisHandler 只会被依赖注入时加载一次,
* 后续无法临时修改 gc_maxlifetime
*
* 又因为现在没有其他情况用到 session
* 只有登录之后才会记下用户信息
*
* 所以一个妥协的方案,就是只有登录了再写入 Redis
*
* (除非重写整套 RedisHandler/RedisHandlerFactory/...
*/
if (!$this->auth($session)) {
$this->sessionManager->end($session);
}
}
return $this->addCookieToResponse($request, $response, $session);
}
private function isSessionAvailable(): bool
{
return $this->config->has('session.handler');
}
/**
* Store the current URL for the request if necessary.
*/
private function storeCurrentUrl(RequestInterface $request, SessionInterface $session)
{
if ($request->getMethod() === 'GET') {
$session->setPreviousUrl($this->fullUrl($request));
}
}
/**
@@ -43,10 +104,13 @@ class SessionMiddleware extends \Hyperf\Session\Middleware\SessionMiddleware
$cookie = new Cookie(
name: $session->getName(),
value: $session->getId(),
expire: $this->getCookieExpirationDate(),
expire: $this->getCookieExpirationDate($session),
path: $this->config->get('session.options.path', '/'),
domain: $this->config->get('session.options.domain', $request->getUri()->getHost()),
secure: $this->config->get('session.options.secure', strtolower($request->getUri()->getScheme()) === 'https'),
secure: $this->config->get(
'session.options.secure',
strtolower($request->getUri()->getScheme()) === 'https'
),
httpOnly: true,
sameSite: $this->config->get('session.options.samesite', Cookie::SAMESITE_LAX)
);
@@ -57,12 +121,24 @@ class SessionMiddleware extends \Hyperf\Session\Middleware\SessionMiddleware
return $response->withCookie($cookie);
}
/**
* Get the full URL for the request.
*/
private function fullUrl(RequestInterface $request): string
{
$uri = $request->getUri();
$query = $uri->getQuery();
$question = $uri->getHost() . $uri->getPath() == '/' ? '/?' : '?';
return $query ? $this->url($request) . $question . $query : $this->url($request);
}
/**
* Get the session lifetime in seconds.
*/
private function getCookieExpirationDate(): int
private function getCookieExpirationDate(SessionInterface $session): int
{
if ($this->config->get('session.options.expire_on_close')) {
// if ($this->config->get('session.options.expire_on_close')) {
if (!$this->auth($session)) {
$expirationDate = 0;
} else {
$expireSeconds = $this->config->get('session.options.cookie_lifetime', 5 * 60 * 60);
@@ -70,4 +146,17 @@ class SessionMiddleware extends \Hyperf\Session\Middleware\SessionMiddleware
}
return $expirationDate;
}
/**
* Get the URL (no query string) for the request.
*/
private function url(RequestInterface $request): string
{
return rtrim(preg_replace('/\?.*/', '', (string)$request->getUri()));
}
private function auth(SessionInterface $session)
{
return $session->has('userInfo');
}
}

View File

@@ -11,6 +11,8 @@ namespace Singularity\HDK\Core\Service;
use Hyperf\Context\Context;
use function Hyperf\Config\config;
class ApiStyleService
{
public const RESTFUL = 'restful';

View File

@@ -18,6 +18,8 @@ use Symfony\Component\Mailer\Transport;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
use function Hyperf\Config\config;
/**
* 邮箱验证码
*/

View File

@@ -6,15 +6,12 @@ namespace Singularity\HDK\Core\Service;
use Ergebnis\Http\Method;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Exception\ServerException;
use GuzzleHttp\Psr7\Request;
use GuzzleHttp\Psr7\Utils;
use Hyperf\Codec\Json;
use Hyperf\Di\Annotation\Inject;
use Hyperf\Guzzle\ClientFactory;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
/**
@@ -22,7 +19,7 @@ use Psr\Http\Message\ResponseInterface;
*/
class HttpRequestService
{
public const TIMEOUT = 20;
// public const TIMEOUT = 20;
#[Inject]
private ClientFactory $client;
@@ -35,14 +32,16 @@ class HttpRequestService
/**
* @param string $url
* @param array<string, string|int> $params
* @param array $data
* @return ResponseInterface
* @throws GuzzleException
*/
public function requestGet(string $url, array $params = []): ResponseInterface
public function requestGet(string $url, array $params = [], array $data = []): ResponseInterface
{
$request = new Request(Method\Rfc\Rfc7231::GET, $url);
return $this->getClient()->send($request, [
'params' => $params,
'query' => $params,
'json' => $data,
]);
}
@@ -58,12 +57,17 @@ class HttpRequestService
* @return ResponseInterface
* @throws GuzzleException
*/
public function requestPost(string $url, array $data = [], array $params = []): ResponseInterface
public function requestPost(string $url, array $params = [], array $data = []): ResponseInterface
{
$data = Json::encode($data);
$request = new Request('post', $url, ['Content-Type' => 'application/json'], Utils::streamFor($data));
$request = new Request(
'post',
$url,
['Content-Type' => 'application/json'],
Utils::streamFor($data),
);
return $this->getClient()->send($request, [
'params' => $params,
'query' => $params,
]);
}
@@ -75,18 +79,13 @@ class HttpRequestService
* @return ResponseInterface
* @throws GuzzleException
*/
public function requestPut(string $url, array $data = [], array $params = []): ResponseInterface
public function requestPut(string $url, array $params = [], array $data = []): ResponseInterface
{
$data = Json::encode($data);
$request = new Request('put', $url, ['Content-Type' => 'application/json'], Utils::streamFor($data));
$result = $this->getClient()->send($request, [
'params' => $params,
return $this->getClient()->send($request, [
'query' => $params,
]);
$json = Json::decode($result->getBody()->getContents());
if ($json['code'] !== 200) {
throw new ServerException($json['message'], $request, $result);
}
return $result;
}
/**
@@ -99,20 +98,4 @@ class HttpRequestService
$this->options = array_replace_recursive($this->options, $options);
return $this;
}
/**
* @param ResponseInterface $response
* @param RequestInterface $request
* @return ResponseInterface
*/
private function parseResponse(
ResponseInterface $response,
RequestInterface $request
): ResponseInterface {
if ($response->getStatusCode() >= 200 && $response->getStatusCode() < 300) {
return $response;
} else {
throw new BadResponseException($response->getReasonPhrase(), $request, $response);
}
}
}

View File

@@ -9,7 +9,9 @@
namespace Singularity\HDK\Core\Service;
use Hyperf\Utils\Codec\Json;
use Hyperf\Codec\Json;
use function Hyperf\Config\config;
class OssService
{

View File

@@ -6,12 +6,14 @@ use AlibabaCloud\SDK\Dysmsapi\V20170525\Dysmsapi;
use AlibabaCloud\SDK\Dysmsapi\V20170525\Models\SendSmsRequest;
use AlibabaCloud\Tea\Exception\TeaError;
use Darabonba\OpenApi\Models\Config;
use Hyperf\Codec\Json;
use Hyperf\HttpMessage\Exception\ServerErrorHttpException;
use Hyperf\Utils\Codec\Json;
use Singularity\HDK\Core\Constants\CommonErrorCode;
use Singularity\HDK\Core\Exceptions\ValidateException;
use UnexpectedValueException;
use function Hyperf\Config\config;
/**
* 短信服务
*/

View File

@@ -7,7 +7,7 @@
* Created on 2023/1/9
*/
use Hyperf\Utils\Codec\Json;
use Hyperf\Codec\Json;
use Singularity\HDK\Core\Service\OssService;
use function Spatie\PestPluginTestTime\testTime;