mirror of
http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore.git
synced 2026-01-15 07:15:06 +08:00
Compare commits
18 Commits
v0.2.19
...
v1.0.0-alp
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3042ce0054 | ||
|
|
b30c84488b | ||
|
|
c262d38ad0 | ||
|
|
a8ec7d8255 | ||
|
|
f1948ab0fe | ||
|
|
ae8001a595 | ||
|
|
68844a6132 | ||
|
|
fd788a7eb8 | ||
|
|
7ccf36b398 | ||
|
|
3d86b05fff | ||
|
|
722d124e1e | ||
|
|
5702e7f913 | ||
|
|
a6ec6951a9 | ||
|
|
a52fc28901 | ||
|
|
2b0374bcc8 | ||
|
|
8616c5f61c | ||
|
|
aee67d78fc | ||
|
|
8974ee595b |
61
CHANGELOG.md
61
CHANGELOG.md
@@ -1,4 +1,65 @@
|
||||
# 版本更新日志
|
||||
## [1.0.0-alpha.2](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/compare/v1.0.0-alpha.1...v1.0.0-alpha.2) (2023-07-21)
|
||||
|
||||
|
||||
### 🐛 Bug Fixes | Bug 修复
|
||||
|
||||
* **controller:** 修复方法访问级别不足以继承的问题 ([b30c844](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/b30c84488b7f85447bd802df77c9decbf315ed85))
|
||||
|
||||
## [1.0.0-alpha.1](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/compare/v1.0.0-alpha.0...v1.0.0-alpha.1) (2023-07-21)
|
||||
|
||||
|
||||
### 📦 Build System | 打包构建
|
||||
|
||||
* **composer:** 更新依赖 ([a8ec7d8](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/a8ec7d82556c2fb8fbe1e356eb6d1936401c810a))
|
||||
* **release:** 增加 alpha 标识,准备正式版 ([f1948ab](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/f1948ab0fe4594140eede8e52f113963d98a8338))
|
||||
|
||||
## [1.0.0-alpha.0](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/compare/v0.2.23...v1.0.0-alpha.0) (2023-07-21)
|
||||
|
||||
|
||||
### ✏️ Documentation | 文档
|
||||
|
||||
* **utils:** 移除了导致编辑器出错的注解 ([7ccf36b](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/7ccf36b398f86a31c7d8dde6ff24f0d9828cfb80))
|
||||
|
||||
|
||||
### ✨ Features | 新功能
|
||||
|
||||
* **controller:** 增加了一个 Rest 风格的 trait ([68844a6](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/68844a6132059da89f69a34ba59229c40e5bcace))
|
||||
* **trait:** 增加了分页响应的统一处理方法 ([fd788a7](http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore/commit/fd788a7eb804b7fe085346d817123c04c8bd0d01))
|
||||
|
||||
### [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)
|
||||
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
0.2.19
|
||||
1.0.0-alpha.2
|
||||
@@ -111,5 +111,5 @@
|
||||
"url": "https://mirrors.aliyun.com/composer/"
|
||||
}
|
||||
},
|
||||
"version": "0.2.19"
|
||||
"version": "1.0.0-alpha.2"
|
||||
}
|
||||
|
||||
5466
composer.lock
generated
5466
composer.lock
generated
File diff suppressed because it is too large
Load Diff
12
docs/REST 控制器.md
Normal file
12
docs/REST 控制器.md
Normal file
@@ -0,0 +1,12 @@
|
||||
# REST 资源控制器支持
|
||||
|
||||
## 列表的筛选、排序
|
||||
|
||||
* [**RestfulList**](../src/Traits/RestfulList.php)
|
||||
|
||||
### RestfulList
|
||||
在 AbstractController 中已经默认进行了集成
|
||||
|
||||
- parseParameters 用来解析请求
|
||||
- responseFormatter 用来将 builder 转化成响应
|
||||
- restSelect 额外的语法糖,调用了上面的两个方法
|
||||
@@ -9,6 +9,8 @@
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use function Hyperf\Support\env;
|
||||
|
||||
return [
|
||||
// 响应
|
||||
'response' => [
|
||||
|
||||
@@ -2,4 +2,4 @@
|
||||
|
||||
docker run --rm -it \
|
||||
-v $(pwd):/app -e "GIT_AUTHOR_NAME=$(git config user.name)" -e "EMAIL=$(git config user.email)" \
|
||||
detouched/standard-version:latest $1
|
||||
detouched/standard-version:latest -p=alpha $1
|
||||
|
||||
@@ -21,8 +21,8 @@ use Dont\DontToString;
|
||||
use Hyperf\Contract\ContainerInterface;
|
||||
use Hyperf\Contract\StdoutLoggerInterface;
|
||||
use Hyperf\Di\Annotation\Inject;
|
||||
use Hyperf\HttpServer\Contract\RequestInterface;
|
||||
use Hyperf\HttpServer\Contract\ResponseInterface;
|
||||
use Singularity\HDK\Core\Traits\RestfulList;
|
||||
|
||||
/**
|
||||
* 抽象控制器基类
|
||||
@@ -42,13 +42,11 @@ abstract class AbstractController
|
||||
use DontSerialise;
|
||||
use DontDeserialise;
|
||||
use DontToString;
|
||||
use RestfulList;
|
||||
|
||||
#[Inject]
|
||||
protected ContainerInterface $container;
|
||||
|
||||
#[Inject]
|
||||
protected RequestInterface $request;
|
||||
|
||||
#[Inject]
|
||||
protected ResponseInterface $response;
|
||||
|
||||
|
||||
@@ -7,6 +7,8 @@ use Singularity\HDK\Core\Constants\CommonErrorCode;
|
||||
use Teapot\StatusCode\RFC\RFC7231;
|
||||
use Throwable;
|
||||
|
||||
use function Hyperf\Config\config;
|
||||
|
||||
/**
|
||||
* 用户无权访问
|
||||
*/
|
||||
|
||||
@@ -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
|
||||
);
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,8 @@ namespace Singularity\HDK\Core\Service;
|
||||
|
||||
use Hyperf\Context\Context;
|
||||
|
||||
use function Hyperf\Config\config;
|
||||
|
||||
class ApiStyleService
|
||||
{
|
||||
public const RESTFUL = 'restful';
|
||||
|
||||
@@ -18,6 +18,8 @@ use Symfony\Component\Mailer\Transport;
|
||||
use Symfony\Component\Mime\Address;
|
||||
use Symfony\Component\Mime\Email;
|
||||
|
||||
use function Hyperf\Config\config;
|
||||
|
||||
/**
|
||||
* 邮箱验证码
|
||||
*/
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
* 短信服务
|
||||
*/
|
||||
|
||||
@@ -8,7 +8,6 @@ use Closure;
|
||||
use Exception;
|
||||
use Generator;
|
||||
use Hyperf\HttpServer\Contract\RequestInterface;
|
||||
use JetBrains\PhpStorm\NoReturn;
|
||||
use JetBrains\PhpStorm\Pure;
|
||||
use Psr\Http\Message\ResponseInterface;
|
||||
|
||||
@@ -236,7 +235,6 @@ class UtilsService
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
#[NoReturn]
|
||||
public function unlimitedSubCategoriesQuicklyWithLevel(
|
||||
array &$list,
|
||||
int $level = 1,
|
||||
|
||||
78
src/Traits/RestfulList.php
Normal file
78
src/Traits/RestfulList.php
Normal file
@@ -0,0 +1,78 @@
|
||||
<?php
|
||||
/**
|
||||
* Paginatable.php@Core
|
||||
*
|
||||
* @author 李东云 <Dongyun.Li@LuxCreo.Ai>
|
||||
* Powered by PhpStorm
|
||||
* Created on 2023/7/18
|
||||
*/
|
||||
|
||||
namespace Singularity\HDK\Core\Traits;
|
||||
|
||||
use Closure;
|
||||
use Hyperf\Contract\LengthAwarePaginatorInterface;
|
||||
use Hyperf\Database\Model\Builder;
|
||||
use Hyperf\Di\Annotation\Inject;
|
||||
use Hyperf\HttpServer\Contract\RequestInterface;
|
||||
use Hyperf\Stringable\Str;
|
||||
use Singularity\HDK\Core\Service\ExtendService;
|
||||
|
||||
trait RestfulList
|
||||
{
|
||||
#[Inject]
|
||||
protected ExtendService $extend;
|
||||
#[Inject]
|
||||
protected RequestInterface $request;
|
||||
|
||||
protected function restSelect(Closure $callback, ?Closure $filter = null)
|
||||
{
|
||||
$options = [];
|
||||
$result = $this->parseParameters(function ($query, $parsedOptions) use ($callback, &$options) {
|
||||
$options = $parsedOptions;
|
||||
$callback($query, $parsedOptions);
|
||||
});
|
||||
return $this->responseFormatter($options, $result, $filter);
|
||||
}
|
||||
|
||||
protected function parseParameters(Closure $callback): mixed
|
||||
{
|
||||
$query = $this->request->getQueryParams();
|
||||
$options = [
|
||||
'size' => $this->request->query('size'),
|
||||
'page' => $this->request->query('page'),
|
||||
'order' => $this->request->query('order', 'created_at'),
|
||||
'sort' => $this->request->query('sort', 'desc'),
|
||||
'group' => $this->request->query('group'),
|
||||
'extends' => $this->extend->getExtends(),
|
||||
];
|
||||
unset($query['sort'], $query['page'], $query['size'], $query['order'], $query['group'], $query['extends']);
|
||||
return $callback(query: $query, options: $options);
|
||||
}
|
||||
|
||||
protected function responseFormatter(
|
||||
array $options,
|
||||
Builder $builder,
|
||||
?Closure $filter = null
|
||||
) {
|
||||
$perPage = $options['size'] ?? null;
|
||||
$order = $options['order'] ?? 'created_at';
|
||||
$sort = $options['sort'] ?? 'desc';
|
||||
$pagination = !!($options['page'] ?? $perPage ?? false);
|
||||
// $group = $options['group'] ?? null;
|
||||
|
||||
$builder = $builder->orderBy(Str::snake($order), $sort);
|
||||
$result = $pagination ? $builder->paginate($perPage) : $builder->get();
|
||||
|
||||
if (is_null($filter)) {
|
||||
return $result;
|
||||
}
|
||||
|
||||
if ($result instanceof LengthAwarePaginatorInterface) {
|
||||
$collection = $result->getCollection();
|
||||
$collection = $filter($collection);
|
||||
|
||||
return $result->setCollection($collection);
|
||||
}
|
||||
return $filter($result);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user