feat: 增加了inArray、hasExtends方法

This commit is contained in:
李东云
2023-03-14 18:29:05 +08:00
parent 7c1efe1a1f
commit de96e288c3
11 changed files with 139 additions and 78 deletions

View File

@@ -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\.#'

View File

@@ -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);
} }
} }

View File

@@ -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);
}
} }

View File

@@ -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);
} }
} }

View File

@@ -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;
} }
}
}

View File

@@ -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);
} }
} }

View File

@@ -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));
} }
} }

View File

@@ -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);
} }
} }
} }

View File

@@ -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]);
}
} }

View File

@@ -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) {

View File

@@ -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');