mirror of
http://124.126.16.154:8888/singularity/HyperfDevelopmentKitCore.git
synced 2026-01-15 05:55:12 +08:00
feat: 增加了inArray、hasExtends方法
This commit is contained in:
@@ -1,9 +1,13 @@
|
|||||||
parameters:
|
parameters:
|
||||||
level: 6
|
level: 6
|
||||||
|
reportUnmatchedIgnoredErrors: false
|
||||||
|
checkGenericClassInNonGenericObjectType: false
|
||||||
paths:
|
paths:
|
||||||
- publish
|
- publish
|
||||||
- src
|
- src
|
||||||
- tests
|
- testsi
|
||||||
ignoreErrors:
|
ignoreErrors:
|
||||||
- '#Constant BASE_PATH not found#'
|
- '#Constant BASE_PATH not found#'
|
||||||
- '#Property [a-zA-Z0-9\\_]+::\$[a-zA-Z0-9]+ is never written, only read.#'
|
- '#Property [a-zA-Z0-9\\_]+::\$[a-zA-Z0-9]+ is never written, only read\.#'
|
||||||
|
- '#Method [a-zA-Z0-9\\_]+::[a-zA-Z0-9]+\(\) is unused\.#'
|
||||||
|
- '#Method [a-zA-Z0-9\\_]+::[a-zA-Z0-9]+\(\) has parameter \$response with no value type specified in iterable type array\.#'
|
||||||
|
|||||||
@@ -29,4 +29,4 @@ class ClassicStyleMiddleware implements MiddlewareInterface
|
|||||||
$this->apiStyleService->set(ApiStyleService::CLASSIC);
|
$this->apiStyleService->set(ApiStyleService::CLASSIC);
|
||||||
return $handler->handle($request);
|
return $handler->handle($request);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,13 +39,59 @@ class CommonCoreMiddleware extends CoreMiddleware
|
|||||||
private ApiStyleService $apiStyleService;
|
private ApiStyleService $apiStyleService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Transfer the non-standard response content to a standard response object.
|
* @inheritDoc
|
||||||
* @template TKey of array-key
|
|
||||||
* @template TValue
|
|
||||||
* @param null|array<TKey, TValue>|Arrayable<TKey, TValue>|Jsonable|string $response
|
|
||||||
*/
|
*/
|
||||||
protected function transferToClassicResponse($response, ServerRequestInterface $request): ResponseInterface
|
protected function transferToResponse($response, ServerRequestInterface $request): ResponseInterface
|
||||||
{
|
{
|
||||||
|
$style = $this->apiStyleService->get();
|
||||||
|
|
||||||
|
if ($style === ApiStyleService::RESTFUL) {
|
||||||
|
return $this->transferToRestfulResponse($response, $request);
|
||||||
|
} else {
|
||||||
|
return $this->transferToClassicResponse($response, $request);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array|string|Arrayable|Jsonable|null $response
|
||||||
|
* @param ServerRequestInterface $request
|
||||||
|
* @return ResponseInterface
|
||||||
|
*/
|
||||||
|
protected function transferToRestfulResponse(Arrayable|Jsonable|array|string|null $response, ServerRequestInterface $request): ResponseInterface
|
||||||
|
{
|
||||||
|
// 分页数据
|
||||||
|
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');
|
||||||
|
return $this->utilsService->extendLinkToHeader(
|
||||||
|
$fact_response,
|
||||||
|
$response->previousPageUrl(),
|
||||||
|
'prev'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return parent::transferToResponse($response, $request);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array|string|Arrayable|Jsonable|null $response
|
||||||
|
* @param ServerRequestInterface $request
|
||||||
|
* @return ResponseInterface
|
||||||
|
*/
|
||||||
|
protected function transferToClassicResponse(
|
||||||
|
Arrayable|Jsonable|array|string|null $response,
|
||||||
|
ServerRequestInterface $request
|
||||||
|
): ResponseInterface {
|
||||||
$code_name = config('common.response.code_name');
|
$code_name = config('common.response.code_name');
|
||||||
$message_name = config('common.response.message_name');
|
$message_name = config('common.response.message_name');
|
||||||
$data_name = config('common.response.data_name');
|
$data_name = config('common.response.data_name');
|
||||||
@@ -108,49 +154,4 @@ class CommonCoreMiddleware extends CoreMiddleware
|
|||||||
new SwooleStream((string)$response)
|
new SwooleStream((string)$response)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function transferToResponse($response, ServerRequestInterface $request): ResponseInterface
|
|
||||||
{
|
|
||||||
$style = $this->apiStyleService->get();
|
|
||||||
|
|
||||||
if ($style === ApiStyleService::RESTFUL) {
|
|
||||||
return $this->transferToRestfulResponse($response, $request);
|
|
||||||
} else {
|
|
||||||
return $this->transferToClassicResponse($response, $request);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @template TKey of array-key
|
|
||||||
* @template TValue
|
|
||||||
* @param null|array<TKey, TValue>|Arrayable<TKey, TValue>|Jsonable|string $response
|
|
||||||
* @param ServerRequestInterface $request
|
|
||||||
* @return ResponseInterface
|
|
||||||
*/
|
|
||||||
protected function transferToRestfulResponse($response, ServerRequestInterface $request): ResponseInterface
|
|
||||||
{
|
|
||||||
// 分页数据
|
|
||||||
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');
|
|
||||||
return $this->utilsService->extendLinkToHeader(
|
|
||||||
$fact_response,
|
|
||||||
$response->previousPageUrl(),
|
|
||||||
'prev'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return parent::transferToResponse($response, $request);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,4 +29,4 @@ class RestStyleMiddleware implements MiddlewareInterface
|
|||||||
$this->apiStyleService->set(ApiStyleService::RESTFUL);
|
$this->apiStyleService->set(ApiStyleService::RESTFUL);
|
||||||
return $handler->handle($request);
|
return $handler->handle($request);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ class SessionMiddleware extends \Hyperf\Session\Middleware\SessionMiddleware
|
|||||||
ResponseInterface $response,
|
ResponseInterface $response,
|
||||||
SessionInterface $session
|
SessionInterface $session
|
||||||
): ResponseInterface {
|
): ResponseInterface {
|
||||||
|
|
||||||
$cookie = new Cookie(
|
$cookie = new Cookie(
|
||||||
name: $session->getName(),
|
name: $session->getName(),
|
||||||
value: $session->getId(),
|
value: $session->getId(),
|
||||||
@@ -71,5 +70,4 @@ class SessionMiddleware extends \Hyperf\Session\Middleware\SessionMiddleware
|
|||||||
}
|
}
|
||||||
return $expirationDate;
|
return $expirationDate;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
||||||
|
|||||||
@@ -21,7 +21,11 @@ class ApiStyleService
|
|||||||
Context::set(self::class, config('common.response.restful') ? self::RESTFUL : self::CLASSIC);
|
Context::set(self::class, config('common.response.restful') ? self::RESTFUL : self::CLASSIC);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function set($style): static
|
/**
|
||||||
|
* @param literal-string $style
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function set(string $style): static
|
||||||
{
|
{
|
||||||
Context::set(self::class, $style === self::RESTFUL ? self::RESTFUL : self::CLASSIC);
|
Context::set(self::class, $style === self::RESTFUL ? self::RESTFUL : self::CLASSIC);
|
||||||
return $this;
|
return $this;
|
||||||
@@ -33,4 +37,4 @@ class ApiStyleService
|
|||||||
? ApiStyleService::RESTFUL
|
? ApiStyleService::RESTFUL
|
||||||
: ApiStyleService::CLASSIC);
|
: ApiStyleService::CLASSIC);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,10 @@ use Psr\Http\Message\ServerRequestInterface;
|
|||||||
*/
|
*/
|
||||||
class ExtendService
|
class ExtendService
|
||||||
{
|
{
|
||||||
|
public function __construct(private UtilsService $utils)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param ServerRequestInterface|null $request
|
* @param ServerRequestInterface|null $request
|
||||||
* @param array<string, string>|null $params
|
* @param array<string, string>|null $params
|
||||||
@@ -29,6 +33,7 @@ class ExtendService
|
|||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array<string, string>
|
* @return array<string, string>
|
||||||
*/
|
*/
|
||||||
@@ -37,6 +42,12 @@ class ExtendService
|
|||||||
return Context::get(self::class) ?? [];
|
return Context::get(self::class) ?? [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function hasExtends(): bool
|
||||||
|
{
|
||||||
|
$extends = Context::get(self::class);
|
||||||
|
return is_array($extends) && count($extends) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 判断是否传入了此扩展
|
* 判断是否传入了此扩展
|
||||||
*
|
*
|
||||||
@@ -44,8 +55,8 @@ class ExtendService
|
|||||||
*
|
*
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function hasExtends(string $field): bool
|
public function hasExtend(string $field): bool
|
||||||
{
|
{
|
||||||
return Context::has(self::class) && isset(array_flip(Context::get(self::class))[$field]);
|
return $this->utils->inArray($field, Context::get(self::class));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,8 +37,10 @@ class HttpRequestService
|
|||||||
private array $options = [];
|
private array $options = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @param string $url
|
||||||
|
* @param array<string, string|int> $params
|
||||||
|
* @return ResponseInterface
|
||||||
* @throws GuzzleException
|
* @throws GuzzleException
|
||||||
* @throws ClientExceptionInterface
|
|
||||||
*/
|
*/
|
||||||
public function requestGet(string $url, array $params = []): ResponseInterface
|
public function requestGet(string $url, array $params = []): ResponseInterface
|
||||||
{
|
{
|
||||||
@@ -55,14 +57,15 @@ class HttpRequestService
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $url
|
* @param string $url
|
||||||
* @param array $data
|
* @param array<string, mixed> $data
|
||||||
* @param array $params
|
* @param array<string, string|int> $params
|
||||||
* @return ResponseInterface
|
* @return ResponseInterface
|
||||||
* @throws GuzzleException
|
* @throws GuzzleException
|
||||||
*/
|
*/
|
||||||
public function requestPost(string $url, string $data = '', array $params = []): ResponseInterface
|
public function requestPost(string $url, array $data = [], array $params = []): ResponseInterface
|
||||||
{
|
{
|
||||||
$request = new Request('post', $url, [], $data);
|
$data = Json::encode($data);
|
||||||
|
$request = new Request('post', $url, ['Content-Type' => 'application/json'], Utils::streamFor($data));
|
||||||
return $this->getClient()->send($request, [
|
return $this->getClient()->send($request, [
|
||||||
'params' => $params,
|
'params' => $params,
|
||||||
]);
|
]);
|
||||||
@@ -71,8 +74,8 @@ class HttpRequestService
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $url
|
* @param string $url
|
||||||
* @param array $data
|
* @param array<string, mixed> $data
|
||||||
* @param array $params
|
* @param array<string, string|int> $params
|
||||||
* @return ResponseInterface
|
* @return ResponseInterface
|
||||||
* @throws GuzzleException
|
* @throws GuzzleException
|
||||||
*/
|
*/
|
||||||
@@ -92,7 +95,7 @@ class HttpRequestService
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 定制 options
|
* 定制 options
|
||||||
* @param array $options
|
* @param array<string, mixed> $options
|
||||||
* @return $this
|
* @return $this
|
||||||
*/
|
*/
|
||||||
public function setOptions(array $options): HttpRequestService
|
public function setOptions(array $options): HttpRequestService
|
||||||
@@ -116,4 +119,4 @@ class HttpRequestService
|
|||||||
throw new BadResponseException($response->getReasonPhrase(), $request, $response);
|
throw new BadResponseException($response->getReasonPhrase(), $request, $response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -328,4 +328,17 @@ class UtilsService
|
|||||||
'unit' => $unitToUpper ? strtoupper($unit[$i]) : $unit[$i],
|
'unit' => $unitToUpper ? strtoupper($unit[$i]) : $unit[$i],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更快的判断数组元素方法
|
||||||
|
* @param float|int|string $needle
|
||||||
|
* @param array<int, mixed> $haystack
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function inArray(float|int|string $needle, array $haystack): bool
|
||||||
|
{
|
||||||
|
$list = array_flip($haystack);
|
||||||
|
return isset($list[$needle]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,15 +9,18 @@
|
|||||||
|
|
||||||
namespace Singularity\HDK\Test\Core\Unit;
|
namespace Singularity\HDK\Test\Core\Unit;
|
||||||
|
|
||||||
use Darabonba\GatewaySpi\Models\InterceptorContext\request;
|
|
||||||
use Singularity\HDK\Core\Service\ExtendService;
|
use Singularity\HDK\Core\Service\ExtendService;
|
||||||
|
use Singularity\HDK\Core\Service\UtilsService;
|
||||||
|
|
||||||
$service = new ExtendService();
|
$service = new ExtendService(new UtilsService());
|
||||||
|
|
||||||
|
|
||||||
|
/** @var ExtendService $service */
|
||||||
|
$service = make(ExtendService::class, ['utils' => new UtilsService()]);
|
||||||
it('asserts no parameters can be parsed.', function (ExtendService $service, $params) {
|
it('asserts no parameters can be parsed.', function (ExtendService $service, $params) {
|
||||||
$service->parse(
|
$service->parse(
|
||||||
request: null,
|
null,
|
||||||
params: $params
|
$params
|
||||||
);
|
);
|
||||||
$result = $service->getExtends();
|
$result = $service->getExtends();
|
||||||
expect($result)->toBeArray()->toHaveCount(0)->toBe([]);
|
expect($result)->toBeArray()->toHaveCount(0)->toBe([]);
|
||||||
@@ -32,17 +35,22 @@ it('asserts no parameters can be parsed.', function (ExtendService $service, $pa
|
|||||||
it('asserts query parameters can be parsed.', function () use ($service) {
|
it('asserts query parameters can be parsed.', function () use ($service) {
|
||||||
$result = $service->parse(
|
$result = $service->parse(
|
||||||
null,
|
null,
|
||||||
params: [
|
[
|
||||||
'id' => 5,
|
'id' => 5,
|
||||||
'extends' => 'a,b',
|
'extends' => 'a,b',
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
expect($result)->toBeArray()->toHaveCount(2)->toBe(['a', 'b']);
|
expect($result)->toBeArray()->toHaveCount(2)->toBe(['a', 'b']);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('asserts has extends', function () use ($service) {
|
it('asserts has extends', function () use ($service) {
|
||||||
expect($service->hasExtends('a'))->toBeTrue()
|
expect($service->hasExtends())->toBeTrue();
|
||||||
->and($service->hasExtends('b'))->toBeTrue()
|
});
|
||||||
->and($service->hasExtends('c'))->toBeFalse();
|
|
||||||
|
it('asserts has specify extend', function () use ($service) {
|
||||||
|
expect($service->hasExtend('a'))->toBeTrue()
|
||||||
|
->and($service->hasExtend('b'))->toBeTrue()
|
||||||
|
->and($service->hasExtend('c'))->toBeFalse();
|
||||||
})->depends('it asserts query parameters can be parsed.');
|
})->depends('it asserts query parameters can be parsed.');
|
||||||
|
|
||||||
it('asserts parsed extends', function () use ($service) {
|
it('asserts parsed extends', function () use ($service) {
|
||||||
|
|||||||
@@ -60,3 +60,22 @@ test('断言可以根据参数构建 URL', function (string $url, array $params,
|
|||||||
'http://username:password@127.0.0.1/git/resp?id=1#/page?a=b&c=d',
|
'http://username:password@127.0.0.1/git/resp?id=1#/page?a=b&c=d',
|
||||||
]
|
]
|
||||||
])->group('pure', 'utils');
|
])->group('pure', 'utils');
|
||||||
|
|
||||||
|
test('断言可以判断是否是数组中的元素', function (
|
||||||
|
$needle,
|
||||||
|
array $haystack,
|
||||||
|
bool $expect,
|
||||||
|
bool $exceptions = false
|
||||||
|
) use ($utils) {
|
||||||
|
try {
|
||||||
|
expect($utils->inArray($needle, $haystack))->toBe($expect);
|
||||||
|
} catch (Throwable $e) {
|
||||||
|
if ($exceptions) {
|
||||||
|
expect(true)->toBeTrue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})->with([
|
||||||
|
[1, ['1', 2, 3], true, false],
|
||||||
|
['1', ['1', 2, 3], true, false],
|
||||||
|
[[1, 2, 3], ['1', 2, 3], false, true],
|
||||||
|
])->group('pure', 'utils');
|
||||||
|
|||||||
Reference in New Issue
Block a user