refactor: 迁移到 hyperf3.1和 pestphp2

Signed-off-by: 李东云 <dongyu.li@luxcreo.ai>
This commit is contained in:
李东云
2023-12-04 17:12:12 +08:00
parent c93ed73f10
commit eee68cab8a
22 changed files with 2836 additions and 1328 deletions

View File

@@ -73,9 +73,9 @@ class CommonHandler extends ExceptionHandler
$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'
);
$this->request?->header('User-Agent', ''),
'apifox'
);
$error_type = $throwable::class;
$request_time = Carbon::now()->toDateTimeString();
$request_data = Json::encode($this->request?->getParsedBody());
@@ -156,7 +156,9 @@ 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' => '资源']
$message = empty($throwable->getCode()) ? CommonErrorCode::getMessage(
$code,
['resource' => '资源']
) : $throwable->getMessage();
$data = [$code_name => $code, $message_name => $message];
$status_code = RFC7231::NOT_FOUND;

View File

@@ -14,6 +14,8 @@ use Hyperf\Guzzle\ClientFactory;
use Psr\Http\Message\ResponseInterface;
use Singularity\HDK\Core\Service\AbstractSingleton;
use function Hyperf\Support\make;
/**
* Singularity\HDK\Core\Service\Http\RequestService@Core
*
@@ -41,7 +43,7 @@ final class RequestService extends AbstractSingleton
{
$this->setOptions($options);
/** @var ClientFactory $client */
$client = \Hyperf\Support\make(ClientFactory::class);
$client = make(ClientFactory::class);
$this->client = $client;
}
@@ -59,7 +61,7 @@ final class RequestService extends AbstractSingleton
/**
* @param string $url
* @param array<string, string|int> $params
* @param array $data
* @param array<string, mixed> $data
* @param Options $options
* @return ResponseInterface
* @throws GuzzleException
@@ -71,7 +73,8 @@ final class RequestService extends AbstractSingleton
array $options = []
): ResponseInterface {
$request = new Request(
method: Method\Rfc\Rfc7231::GET, uri: $url
method: Method\Rfc\Rfc7231::GET,
uri: $url
);
return $this->getClient($options)->send($request, ['query' => $params, 'json' => $data,]);
}
@@ -133,7 +136,8 @@ final class RequestService extends AbstractSingleton
body: Utils::streamFor($data)
);
return $this->getClient($options)->send(
$request, ['query' => $params,]
$request,
['query' => $params,]
);
}
@@ -159,7 +163,8 @@ final class RequestService extends AbstractSingleton
body: Utils::streamFor($data)
);
return $this->getClient($options)->send(
$request, ['query' => $params,]
$request,
['query' => $params,]
);
}
@@ -185,7 +190,8 @@ final class RequestService extends AbstractSingleton
body: Utils::streamFor($data)
);
return $this->getClient($options)->send(
$request, ['query' => $params,]
$request,
['query' => $params,]
);
}
}

View File

@@ -15,8 +15,13 @@ use Singularity\HDK\Core\Service\AbstractFactory;
final class RequestServiceFactory extends AbstractFactory
{
/**
* @param array<string,mixed> $options
*
* @return RequestService
*/
public static function make(array $options = []): RequestService
{
return new RequestService($options);
}
}
}

View File

@@ -15,12 +15,13 @@ use Hyperf\Contract\Arrayable;
use Hyperf\Contract\Jsonable;
use Hyperf\Contract\LengthAwarePaginatorInterface;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpMessage\Server\ResponsePlusProxy;
use Hyperf\HttpMessage\Stream\SwooleStream;
use Hyperf\HttpServer\CoreMiddleware;
use Lmc\HttpConstants\Header;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Singularity\HDK\Core\Service\UtilsService;
use Swow\Psr7\Message\ResponsePlusInterface;
use function Hyperf\Config\config;
@@ -32,7 +33,7 @@ use function Hyperf\Config\config;
* Created on 2022/4/29
*
* @deprecated
* @see CommonCoreMiddleware
* @see CommonCoreMiddleware
*/
class ClassicCoreMiddleware extends CoreMiddleware
{
@@ -43,24 +44,41 @@ class ClassicCoreMiddleware extends CoreMiddleware
* Transfer the non-standard response content to a standard response object.
* @template TKey of array-key
* @template TValue
*
* @param null|array<TKey, TValue>|Arrayable<TKey, TValue>|Jsonable|string $response
*/
protected function transferToResponse($response, ServerRequestInterface $request): ResponseInterface
{
protected function transferToResponse(
$response,
ServerRequestInterface $request
): ResponsePlusInterface {
$code_name = config('common.response.code_name');
$message_name = config('common.response.message_name');
$data_name = config('common.response.data_name');
// 分页数据
if ($response instanceof LengthAwarePaginatorInterface) {
$paginator = $response;
$fact_response = $this->response()->withHeader('Per-Page', (string)$paginator->perPage())->withHeader(
'Total',
(string)$paginator->total()
)->withHeader('Current-Page', (string)$paginator->currentPage())->withHeader(
'Total-Pages',
(string)$paginator->hasPages()
$fact_response = $this->response()
->withHeader(
'Per-Page',
(string)$paginator->perPage()
)
->withHeader(
'Total',
(string)$paginator->total()
)
->withHeader(
'Current-Page',
(string)$paginator->currentPage()
)
->withHeader(
'Total-Pages',
(string)$paginator->hasPages()
);
$fact_response = $this->utilsService->extendLinkToHeader(
$fact_response,
$paginator->nextPageUrl(),
'next'
);
$fact_response = $this->utilsService->extendLinkToHeader($fact_response, $paginator->nextPageUrl(), 'next');
$fact_response = $this->utilsService->extendLinkToHeader(
$fact_response,
$paginator->url($paginator->lastPage()),
@@ -72,23 +90,27 @@ class ClassicCoreMiddleware extends CoreMiddleware
$paginator->previousPageUrl(),
'prev'
);
return $fact_response->withAddedHeader(Header::CONTENT_TYPE, 'application/json')->withBody(
new SwooleStream(
Json::encode(
[
$code_name => 200,
$message_name => 'ok',
$data_name => $response->items(),
'meta' => [
'currentPage' => $paginator->currentPage(),
'lastPage' => $paginator->lastPage(),
'perPage' => $paginator->perPage(),
'total' => $paginator->total(),
],
]
$resp = $fact_response
->withAddedHeader(Header::CONTENT_TYPE, 'application/json')
->withBody(
new SwooleStream(
Json::encode(
[
$code_name => 200,
$message_name => 'ok',
$data_name => $response->items(),
'meta' => [
'currentPage' => $paginator->currentPage(),
'lastPage' => $paginator->lastPage(),
'perPage' => $paginator->perPage(),
'total' => $paginator->total(),
],
]
)
)
)
);
);
return new ResponsePlusProxy($resp);
}
// 普通数组
if (is_array($response) || $response instanceof Arrayable) {

View File

@@ -15,6 +15,7 @@ use Hyperf\Contract\Arrayable;
use Hyperf\Contract\Jsonable;
use Hyperf\Contract\LengthAwarePaginatorInterface;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpMessage\Server\ResponsePlusProxy;
use Hyperf\HttpMessage\Stream\SwooleStream;
use Hyperf\HttpServer\CoreMiddleware;
use Lmc\HttpConstants\Header;
@@ -22,6 +23,7 @@ use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Singularity\HDK\Core\Service\ApiStyleService;
use Singularity\HDK\Core\Service\UtilsService;
use Swow\Psr7\Message\ResponsePlusInterface;
use function Hyperf\Config\config;
@@ -43,24 +45,31 @@ class CommonCoreMiddleware extends CoreMiddleware
/**
* @inheritDoc
*/
protected function transferToResponse($response, ServerRequestInterface $request): ResponseInterface
{
protected function transferToResponse(
$response,
ServerRequestInterface $request
): ResponsePlusInterface {
$style = $this->apiStyleService->get();
if ($style === ApiStyleService::RESTFUL) {
return $this->transferToRestfulResponse($response, $request);
$response = $this->transferToRestfulResponse($response, $request);
} else {
return $this->transferToClassicResponse($response, $request);
$response = $this->transferToClassicResponse($response, $request);
}
return new ResponsePlusProxy($response);
}
/**
* @param array|string|Arrayable|Jsonable|null $response
* @param ServerRequestInterface $request
* @param ServerRequestInterface $request
*
* @return ResponseInterface
*/
protected function transferToRestfulResponse(Arrayable|Jsonable|array|string|null $response, ServerRequestInterface $request): ResponseInterface
{
protected function transferToRestfulResponse(
Arrayable|Jsonable|array|string|null $response,
ServerRequestInterface $request
): ResponseInterface {
// 分页数据
if ($response instanceof LengthAwarePaginatorInterface) {
$fact_response = $this->response()
@@ -88,7 +97,8 @@ class CommonCoreMiddleware extends CoreMiddleware
/**
* @param array|string|Arrayable|Jsonable|null $response
* @param ServerRequestInterface $request
* @param ServerRequestInterface $request
*
* @return ResponseInterface
*/
protected function transferToClassicResponse(

View File

@@ -13,10 +13,11 @@ use Hyperf\Contract\Arrayable;
use Hyperf\Contract\Jsonable;
use Hyperf\Contract\LengthAwarePaginatorInterface;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpMessage\Server\ResponsePlusProxy;
use Hyperf\HttpServer\CoreMiddleware;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Singularity\HDK\Core\Service\UtilsService;
use Swow\Psr7\Message\ResponsePlusInterface;
/**
* Singularity\HDK\Core\Middleware\RestfulCoreMiddleware@HDK-Core
@@ -26,7 +27,7 @@ use Singularity\HDK\Core\Service\UtilsService;
* Created on 2023/1/14
*
* @deprecated
* @see CommonCoreMiddleware
* @see CommonCoreMiddleware
*/
class RestfulCoreMiddleware extends CoreMiddleware
{
@@ -37,11 +38,14 @@ class RestfulCoreMiddleware extends CoreMiddleware
* @template TKey of array-key
* @template TValue
* @param null|array<TKey, TValue>|Arrayable<TKey, TValue>|Jsonable|string $response
* @param ServerRequestInterface $request
* @return ResponseInterface
* @param ServerRequestInterface $request
*
* @return ResponsePlusInterface
*/
protected function transferToResponse($response, ServerRequestInterface $request): ResponseInterface
{
protected function transferToResponse(
$response,
ServerRequestInterface $request
): ResponsePlusInterface {
// 分页数据
if ($response instanceof LengthAwarePaginatorInterface) {
$fact_response = $this->response()
@@ -56,11 +60,12 @@ class RestfulCoreMiddleware extends CoreMiddleware
'last'
);
$fact_response = $this->utilsService->extendLinkToHeader($fact_response, $response->url(1), 'first');
return $this->utilsService->extendLinkToHeader(
$resp = $this->utilsService->extendLinkToHeader(
$fact_response,
$response->previousPageUrl(),
'prev'
);
return new ResponsePlusProxy($resp);
}
return parent::transferToResponse($response, $request);

View File

@@ -86,7 +86,7 @@ class SessionMiddleware implements MiddlewareInterface
/**
* Store the current URL for the request if necessary.
*/
private function storeCurrentUrl(RequestInterface $request, SessionInterface $session)
private function storeCurrentUrl(RequestInterface $request, SessionInterface $session): void
{
if ($request->getMethod() === 'GET') {
$session->setPreviousUrl($this->fullUrl($request));
@@ -155,7 +155,7 @@ class SessionMiddleware implements MiddlewareInterface
return rtrim(preg_replace('/\?.*/', '', (string)$request->getUri()));
}
private function auth(SessionInterface $session)
private function auth(SessionInterface $session): bool
{
return $session->has('userInfo');
}

View File

@@ -13,6 +13,7 @@ namespace Singularity\HDK\Core\Service;
use Dont\DontCall;
use Dont\DontInstantiate;
use Singularity\HDK\Core\Http\RequestService;
/**
* Singularity\HDK\Core\Service\AbstractFactory@Core
@@ -26,5 +27,5 @@ abstract class AbstractFactory
use DontInstantiate;
use DontCall;
abstract static function make();
}
abstract public static function make(): RequestService;
}

View File

@@ -23,4 +23,4 @@ abstract class AbstractSingleton
{
use DontCallStatic;
use DontClone;
}
}

View File

@@ -33,7 +33,7 @@ class HttpRequestService
/**
* @param string $url
* @param array<string, string|int> $params
* @param array $data
* @param array<string, mixed> $data
* @return ResponseInterface
* @throws GuzzleException
*/

View File

@@ -10,11 +10,11 @@
namespace Singularity\HDK\Core\Traits;
use Closure;
use Hyperf\Contract\LengthAwarePaginatorInterface;
use Hyperf\Database\Model\Builder;
use Hyperf\Database\Model\Relations\Relation;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpServer\Contract\RequestInterface;
use Hyperf\Paginator\AbstractPaginator;
use Hyperf\Stringable\Str;
use Singularity\HDK\Core\Service\ExtendService;
@@ -25,7 +25,7 @@ trait RestfulList
#[Inject]
protected RequestInterface $request;
protected function restSelect(Closure $callback, ?Closure $filter = null)
protected function restSelect(Closure $callback, ?Closure $filter = null): mixed
{
$parsed_options = [];
$result = $this->parseParameters(
@@ -52,11 +52,18 @@ trait RestfulList
return $callback(query: $query, options: $options);
}
/**
* @param array<string, mixed> $options
* @param Builder|Relation $builder
* @param Closure|null $filter
*
* @return mixed
*/
protected function responseFormatter(
array $options,
Builder|Relation $builder,
?Closure $filter = null
) {
): mixed {
$perPage = $options['size'] ?? null;
$order = $options['order'] ?? 'created_at';
$sort = $options['sort'] ?? 'desc';
@@ -70,7 +77,7 @@ trait RestfulList
return $result;
}
if ($result instanceof LengthAwarePaginatorInterface) {
if ($result instanceof AbstractPaginator) {
$collection = $result->getCollection();
$collection = $filter($collection);
@@ -78,4 +85,4 @@ trait RestfulList
}
return $filter($result);
}
}
}