2023-03-10 18:29:41 +08:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* ClassicCoreMiddleware.php@hyperf-development-kit
|
|
|
|
|
*
|
|
|
|
|
* @author 李东云<dongyun.li@luxcreo.cn>
|
|
|
|
|
* Powered by PhpStorm
|
|
|
|
|
* Created on 2022/4/29
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
namespace Singularity\HDK\Core\Middleware;
|
|
|
|
|
|
2023-06-19 18:16:41 +08:00
|
|
|
use Hyperf\Codec\Json;
|
2023-03-10 18:29:41 +08:00
|
|
|
use Hyperf\Contract\Arrayable;
|
|
|
|
|
use Hyperf\Contract\Jsonable;
|
|
|
|
|
use Hyperf\Contract\LengthAwarePaginatorInterface;
|
|
|
|
|
use Hyperf\Di\Annotation\Inject;
|
2023-12-04 17:12:12 +08:00
|
|
|
use Hyperf\HttpMessage\Server\ResponsePlusProxy;
|
2023-03-10 18:29:41 +08:00
|
|
|
use Hyperf\HttpMessage\Stream\SwooleStream;
|
|
|
|
|
use Hyperf\HttpServer\CoreMiddleware;
|
2024-06-23 18:13:41 +08:00
|
|
|
use Hyperf\Resource\Json\JsonResource;
|
2023-03-10 18:29:41 +08:00
|
|
|
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;
|
2023-12-04 17:12:12 +08:00
|
|
|
use Swow\Psr7\Message\ResponsePlusInterface;
|
2023-03-10 18:29:41 +08:00
|
|
|
|
2023-06-19 18:16:41 +08:00
|
|
|
use function Hyperf\Config\config;
|
|
|
|
|
|
2023-03-10 18:29:41 +08:00
|
|
|
/**
|
|
|
|
|
* Singularity\HDK\Core\Middleware\CommonCoreMiddleware@HDK-Core
|
|
|
|
|
*
|
|
|
|
|
* @author 李东云 <Dongyun.Li@LuxCreo.Ai>
|
|
|
|
|
* Powered by PhpStorm
|
|
|
|
|
* Created on 2023/3/10
|
|
|
|
|
*/
|
|
|
|
|
class CommonCoreMiddleware extends CoreMiddleware
|
|
|
|
|
{
|
|
|
|
|
#[Inject]
|
|
|
|
|
private UtilsService $utilsService;
|
|
|
|
|
|
|
|
|
|
#[Inject]
|
|
|
|
|
private ApiStyleService $apiStyleService;
|
|
|
|
|
|
|
|
|
|
/**
|
2023-03-14 18:29:05 +08:00
|
|
|
* @inheritDoc
|
2023-03-10 18:29:41 +08:00
|
|
|
*/
|
2023-12-04 17:12:12 +08:00
|
|
|
protected function transferToResponse(
|
|
|
|
|
$response,
|
2024-01-18 13:52:16 +08:00
|
|
|
ServerRequestInterface $request,
|
2023-12-04 17:12:12 +08:00
|
|
|
): ResponsePlusInterface {
|
2023-03-14 18:29:05 +08:00
|
|
|
$style = $this->apiStyleService->get();
|
|
|
|
|
|
2024-06-23 18:13:41 +08:00
|
|
|
if (!($response instanceof ResponseInterface) || $response instanceof JsonResource) {
|
2024-01-18 13:52:16 +08:00
|
|
|
$response = $style === ApiStyleService::RESTFUL
|
|
|
|
|
? $this->transferToRestfulResponse($response, $request)
|
|
|
|
|
: $this->transferToClassicResponse($response, $request);
|
2023-03-14 18:29:05 +08:00
|
|
|
}
|
2023-12-04 17:12:12 +08:00
|
|
|
|
|
|
|
|
return new ResponsePlusProxy($response);
|
2023-03-14 18:29:05 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2023-12-14 15:24:22 +08:00
|
|
|
* @param null|array|Arrayable|Jsonable|ResponseInterface|string $response
|
|
|
|
|
* @param ServerRequestInterface $request
|
2023-12-04 17:12:12 +08:00
|
|
|
*
|
2023-03-14 18:29:05 +08:00
|
|
|
* @return ResponseInterface
|
|
|
|
|
*/
|
2023-12-04 17:12:12 +08:00
|
|
|
protected function transferToRestfulResponse(
|
2023-12-14 15:24:22 +08:00
|
|
|
null|array|Arrayable|Jsonable|ResponseInterface|string $response,
|
2024-01-18 13:52:16 +08:00
|
|
|
ServerRequestInterface $request,
|
2023-12-04 17:12:12 +08:00
|
|
|
): ResponseInterface {
|
2023-03-14 18:29:05 +08:00
|
|
|
// 分页数据
|
|
|
|
|
if ($response instanceof LengthAwarePaginatorInterface) {
|
|
|
|
|
$fact_response = $this->response()
|
|
|
|
|
->withHeader('Per-Page', (string)$response->perPage())
|
|
|
|
|
->withHeader('Total', (string)$response->total())
|
|
|
|
|
->withHeader('Current-Page', (string)$response->currentPage())
|
|
|
|
|
->withHeader('Total-Pages', (string)$response->hasPages());
|
|
|
|
|
$fact_response = $this->utilsService->extendLinkToHeader($fact_response, $response->nextPageUrl(), 'next');
|
|
|
|
|
$fact_response = $this->utilsService->extendLinkToHeader(
|
|
|
|
|
$fact_response,
|
|
|
|
|
$response->url($response->lastPage()),
|
|
|
|
|
'last'
|
|
|
|
|
);
|
|
|
|
|
$fact_response = $this->utilsService->extendLinkToHeader($fact_response, $response->url(1), 'first');
|
2023-04-13 23:37:18 +08:00
|
|
|
$fact_response = $this->utilsService->extendLinkToHeader(
|
2023-03-14 18:29:05 +08:00
|
|
|
$fact_response,
|
|
|
|
|
$response->previousPageUrl(),
|
|
|
|
|
'prev'
|
|
|
|
|
);
|
2023-04-13 23:37:18 +08:00
|
|
|
return $fact_response->withBody(new SwooleStream(Json::encode($response->items())));
|
2023-03-14 18:29:05 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return parent::transferToResponse($response, $request);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2023-12-14 15:24:22 +08:00
|
|
|
* @param null|array|Arrayable|Jsonable|ResponseInterface|string $response
|
|
|
|
|
* @param ServerRequestInterface $request
|
2023-12-04 17:12:12 +08:00
|
|
|
*
|
2023-03-14 18:29:05 +08:00
|
|
|
* @return ResponseInterface
|
|
|
|
|
*/
|
|
|
|
|
protected function transferToClassicResponse(
|
2023-12-14 15:24:22 +08:00
|
|
|
null|array|Arrayable|Jsonable|ResponseInterface|string $response,
|
2024-01-18 13:52:16 +08:00
|
|
|
ServerRequestInterface $request,
|
2023-03-14 18:29:05 +08:00
|
|
|
): ResponseInterface {
|
2023-03-10 18:29:41 +08:00
|
|
|
$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->utilsService->extendLinkToHeader($fact_response, $paginator->nextPageUrl(), 'next');
|
|
|
|
|
$fact_response = $this->utilsService->extendLinkToHeader(
|
|
|
|
|
$fact_response,
|
|
|
|
|
$paginator->url($paginator->lastPage()),
|
|
|
|
|
'last'
|
|
|
|
|
);
|
|
|
|
|
$fact_response = $this->utilsService->extendLinkToHeader($fact_response, $paginator->url(1), 'first');
|
|
|
|
|
$fact_response = $this->utilsService->extendLinkToHeader(
|
|
|
|
|
$fact_response,
|
|
|
|
|
$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(),
|
|
|
|
|
],
|
|
|
|
|
]
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
// 普通数组
|
|
|
|
|
if (is_array($response) || $response instanceof Arrayable) {
|
|
|
|
|
$response = [$code_name => 200, $message_name => 'ok', $data_name => $response];
|
|
|
|
|
return $this->response()->withAddedHeader(Header::CONTENT_TYPE, 'application/json')->withBody(
|
|
|
|
|
new SwooleStream(Json::encode($response))
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
// 可 Json 化的数据结构
|
|
|
|
|
if ($response instanceof Jsonable) {
|
|
|
|
|
$response = [$code_name => 200, $message_name => 'ok', $data_name => Json::decode((string)$response)];
|
|
|
|
|
return $this->response()->withAddedHeader(Header::CONTENT_TYPE, 'application/json')->withBody(
|
|
|
|
|
new SwooleStream(Json::encode($response))
|
|
|
|
|
);
|
|
|
|
|
}
|
2024-01-18 13:52:16 +08:00
|
|
|
if ($response instanceof ResponseInterface) {
|
|
|
|
|
return $response;
|
|
|
|
|
}
|
2023-03-10 18:29:41 +08:00
|
|
|
// 其他默认按字符串处理
|
|
|
|
|
return $this->response()->withAddedHeader(Header::CONTENT_TYPE, 'text/plain')->withBody(
|
|
|
|
|
new SwooleStream((string)$response)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|