Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions src/Annotations/Output/OutputDateFormat.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,6 @@
use DateTimeZone;
use Exception;

/**
* toArray 输出值为 固定日期格式 默认 YYYY-MM-DD HH:ii:ss的日期格式
*/
#[Attribute(Attribute::TARGET_PROPERTY | Attribute::TARGET_CLASS)]
class OutputDateFormat implements OutValueCastInterface
{
Expand Down
6 changes: 3 additions & 3 deletions src/Casts/Normalizer/ArrayNormalizerCast.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@ class ArrayNormalizerCast implements NormalizerCastInterface
{
public function match(mixed $values): bool
{
return is_object($values) && method_exists($values, 'toArray');
return is_object($values) && method_exists($values, 'toArray');
}

public function resolve(mixed $values): mixed
{
if($this->match($values)){
if ($this->match($values)) {
return $values->toArray();
}

return $values;
}
}
}
27 changes: 27 additions & 0 deletions src/Casts/Normalizer/DateTimeNormalizerCast.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace Astral\Serialize\Casts\Normalizer;

use Astral\Serialize\Contracts\Normalizer\NormalizerCastInterface;
use DateTimeInterface;
use Throwable;

class DateTimeNormalizerCast implements NormalizerCastInterface
{
public function match(mixed $values): bool
{
return is_object($values) && is_subclass_of($values, DateTimeInterface::class);
}

public function resolve(mixed $values): mixed
{
if ($this->match($values)) {
try {
return $values->format('Y-m-d H:i:s');
} catch (Throwable $e) {
}
}

return $values;
}
}
6 changes: 3 additions & 3 deletions src/Casts/Normalizer/JsonNormalizerCast.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ public function match(mixed $values): bool
return is_string($values);
}

public function resolve(mixed $values): array
public function resolve(mixed $values): mixed
{
if($this->match($values)){
if ($this->match($values)) {
try {
$decoded = json_decode($values, true, 512, JSON_THROW_ON_ERROR);
return is_array($decoded) ? $decoded : $values;
Expand All @@ -25,4 +25,4 @@ public function resolve(mixed $values): array

return $values;
}
}
}
22 changes: 22 additions & 0 deletions src/Casts/Normalizer/ObjectNormalizerCast.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

namespace Astral\Serialize\Casts\Normalizer;

use Astral\Serialize\Contracts\Normalizer\NormalizerCastInterface;

class ObjectNormalizerCast implements NormalizerCastInterface
{
public function match(mixed $values): bool
{
return is_object($values);
}

public function resolve(mixed $values): mixed
{
if ($this->match($values)) {
return (array)$values;
}

return $values;
}
}
2 changes: 1 addition & 1 deletion src/Contracts/Normalizer/NormalizerCastInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ interface NormalizerCastInterface
public function match(mixed $values): bool;

public function resolve(mixed $values): mixed;
}
}
32 changes: 32 additions & 0 deletions src/Enums/ConfigCastEnum.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace Astral\Serialize\Enums;

use Astral\Serialize\Contracts\Attribute\DataCollectionCastInterface;
use Astral\Serialize\Contracts\Attribute\InputValueCastInterface;
use Astral\Serialize\Contracts\Attribute\OutValueCastInterface;
use Astral\Serialize\Contracts\Normalizer\NormalizerCastInterface;

enum ConfigCastEnum: string
{
case PROPERTY = 'attributePropertyResolver';
case OUTPUT_VALUE = 'outputValueCasts';
case INPUT_VALUE = 'inputValueCasts';
case INPUT_NORMALIZER = 'inputNormalizerCasts';
case OUT_NORMALIZER = 'outNormalizerCasts';

public function getCastInterface(): string
{
return match ($this) {
self::PROPERTY => DataCollectionCastInterface::class,
self::OUTPUT_VALUE => OutValueCastInterface::class,
self::INPUT_VALUE => InputValueCastInterface::class,
self::INPUT_NORMALIZER, self::OUT_NORMALIZER => NormalizerCastInterface::class,
};
}

public static function getValues(): array
{
return array_column(self::cases(), 'value');
}
}
33 changes: 15 additions & 18 deletions src/OpenApi/Collections/OpenApiCollection.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
use Astral\Serialize\OpenApi\Storage\OpenAPI\SchemaStorage;
use Astral\Serialize\Resolvers\GroupResolver;
use Astral\Serialize\Serialize;
use Astral\Serialize\SerializeContainer;
use Astral\Serialize\Support\Factories\ContextFactory;
use Psr\SimpleCache\InvalidArgumentException;
use ReflectionMethod;
Expand All @@ -32,8 +31,8 @@ public function __construct(
public string $methodName,
public reflectionMethod $reflectionMethod,
public Tag $tag,
public Summary $summary,
public Route $route,
public Summary|null $summary,
public Route|null $route,
public Headers|null $headers,
public array $attributes,
public RequestBody|null $requestBody,
Expand All @@ -58,7 +57,7 @@ public function build(): Method
$requestBody = $this->buildRequestBody(
className:$this->getRequestBodyClass(),
contentType:$this->requestBody->contentType ?? ContentTypeEnum::JSON,
groups: $this->requestBody->groups ?? []
groups: $this->requestBody->groups ?? []
);

$response = $this->buildResponse(
Expand All @@ -71,10 +70,9 @@ className:$this->getResponseClass(),
return $openAPIMethod;
}


public function getRequestBodyClass(): string
{
if($this->requestBody?->className){
if ($this->requestBody?->className) {
return $this->requestBody->className;
}

Expand All @@ -88,12 +86,11 @@ public function getRequestBodyClass(): string
return '';
}


public function buildRequestBody(string $className,ContentTypeEnum $contentType,array $groups = []): RequestBodyStorage
public function buildRequestBody(string $className, ContentTypeEnum $contentType, array $groups = []): RequestBodyStorage
{
$openAPIRequestBody = new RequestBodyStorage($contentType);
if (is_subclass_of($className, Serialize::class)) {
$schemaStorage = (new SchemaStorage())->build($this->buildRequestParameterCollections($className,$groups));
$schemaStorage = (new SchemaStorage())->build($this->buildRequestParameterCollections($className, $groups));
$openAPIRequestBody->withParameter($schemaStorage);
}

Expand All @@ -102,7 +99,7 @@ public function buildRequestBody(string $className,ContentTypeEnum $contentType,

public function getResponseClass(): string
{
if($this->response?->className){
if ($this->response?->className) {
return $this->response->className;
}

Expand All @@ -118,18 +115,18 @@ public function getResponseClass(): string
/**
* @throws InvalidArgumentException
*/
public function buildResponse(string $className,array $groups = []): ResponseStorage
public function buildResponse(string $className, array $groups = []): ResponseStorage
{
$responseStorage = new ResponseStorage();

$baseResponse = Config::get('response',[]);
$baseResponse = Config::get('response', []);

if ($className) {
$schemaStorage = (new SchemaStorage())->build($this->buildResponseParameterCollections($className,$groups));
$schemaStorage = (new SchemaStorage())->build($this->buildResponseParameterCollections($className, $groups));
$responseStorage->withParameter($schemaStorage);
}

if($baseResponse){
if ($baseResponse) {
$responseStorage->addGlobParameters($baseResponse);
}

Expand All @@ -148,13 +145,13 @@ public function buildRequestParameterCollections(string $className, array $group
$serializeContext = ContextFactory::build($className);
$serializeContext->setGroups($groups)->from();
$properties = $serializeContext->getGroupCollection()->getProperties();
$groups = $groups ?: [$className];
$groups = $groups ?: [$className];

$vols = [];
foreach ($properties as $property) {


if($property->isInputIgnoreByGroups($groups) || !$this->groupResolver->resolveExistsGroupsByDataCollection($property, $groups, $className)){
if ($property->isInputIgnoreByGroups($groups) || !$this->groupResolver->resolveExistsGroupsByDataCollection($property, $groups, $className)) {
continue;
}

Expand Down Expand Up @@ -192,12 +189,12 @@ public function buildResponseParameterCollections(string $className, array $grou
$serializeContext = ContextFactory::build($className);
$serializeContext->from();
$properties = $serializeContext->getGroupCollection()->getProperties();
$groups = $groups ?: [$className];
$groups = $groups ?: [$className];

$vols = [];
foreach ($properties as $property) {

if($property->isOutIgnoreByGroups($groups) || !$this->groupResolver->resolveExistsGroupsByDataCollection($property, $groups, $className)){
if ($property->isOutIgnoreByGroups($groups) || !$this->groupResolver->resolveExistsGroupsByDataCollection($property, $groups, $className)) {
continue;
}

Expand Down
2 changes: 1 addition & 1 deletion src/OpenApi/Frankenphp/docs/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<body>

<elements-api
apiDescriptionUrl="<?php echo \Astral\Serialize\OpenApi\Handler\Config::get('doc_url','http://127.0.0.1:8089'); ?>"
apiDescriptionUrl="<?php echo \Astral\Serialize\OpenApi\Handler\Config::get('doc_url', 'http://127.0.0.1:8089'); ?>"
router="hash"
layout="sidebar"
/>
Expand Down
1 change: 1 addition & 0 deletions src/OpenApi/Frankenphp/index.php
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
<?php

use Astral\Serialize\OpenApi;

ignore_user_abort(true);
Expand Down
2 changes: 1 addition & 1 deletion src/OpenApi/Storage/OpenAPI/OpenAPI.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public function withTags(array $tags): self

public function addTag(TagStorage $tag): void
{
// $this->tags[$tag->name] = $tag;
// $this->tags[$tag->name] = $tag;
}

public function withPaths(array $paths): self
Expand Down
14 changes: 7 additions & 7 deletions src/OpenApi/Storage/OpenAPI/ResponseStorage.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,19 +25,19 @@ public function withParameter(SchemaStorage $schema): static

public function addGlobParameters(array $vols): void
{
$dates = $this->parameter['properties'] ?? [];
$required = $this->parameter['required'] ?? [];
$dates = $this->parameter['properties'] ?? [];
$required = $this->parameter['required'] ?? [];

$this->parameter['properties'] = [];

foreach ($vols as $field => $item){
if($item === 'T'){
foreach ($vols as $field => $item) {
if ($item === 'T') {
$this->parameter['properties'][$field] = [
'type' => 'object',
'properties' => $dates,
'required' => $required,
'properties' => $dates,
'required' => $required,
];
}else{
} else {
$this->parameter['properties'][$field] = [
'type' => 'string',
'description' => $item['description'] ?? '',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,9 @@

namespace Astral\Serialize\Resolvers\Casts;

use Astral\Serialize\Support\Collections\DataCollection;
use Astral\Serialize\Support\Config\ConfigManager;
use Astral\Serialize\Support\Context\InputValueContext;

class NormalizerCastResolver
class InputNormalizerCastResolver
{
public function __construct(
private readonly ConfigManager $configManager
Expand All @@ -16,10 +14,10 @@ public function __construct(

public function resolve(mixed $values): mixed
{
foreach ($this->configManager->getNormalizerCasts() as $cast) {
foreach ($this->configManager->getInputNormalizerCasts() as $cast) {
$values = $cast->resolve($values);
}

return $values;
}
}
}
23 changes: 23 additions & 0 deletions src/Resolvers/Casts/OutNormalizerCastResolver.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

namespace Astral\Serialize\Resolvers\Casts;

use Astral\Serialize\Support\Config\ConfigManager;

class OutNormalizerCastResolver
{
public function __construct(
private readonly ConfigManager $configManager
) {

}

public function resolve(mixed $values): mixed
{
foreach ($this->configManager->getOutNormalizerCasts() as $cast) {
$values = $cast->resolve($values);
}

return $values;
}
}
5 changes: 3 additions & 2 deletions src/Resolvers/OutputResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

namespace Astral\Serialize\Resolvers;

use Astral\Serialize\Resolvers\Casts\OutNormalizerCastResolver;
use Astral\Serialize\Resolvers\Casts\OutputCastResolver;
use Astral\Serialize\Serialize;
use Astral\Serialize\Support\Collections\DataCollection;
use Astral\Serialize\Support\Collections\GroupDataCollection;
use Astral\Serialize\Support\Context\ChoosePropertyContext;
Expand All @@ -17,6 +17,7 @@ public function __construct(
protected readonly ReflectionClassInstanceManager $reflectionClassInstanceManager,
private readonly OutputCastResolver $outValueCastResolver,
protected readonly GroupResolver $groupResolver,
private readonly OutNormalizerCastResolver $normalizerCastResolver,
) {

}
Expand Down Expand Up @@ -52,7 +53,7 @@ classInstance: $object,
);

foreach ($matchData['names'] as $name) {
$toArray[$name] = $resolvedValue instanceof Serialize ? $resolvedValue->toArray() : $resolvedValue;
$toArray[$name] = $this->normalizerCastResolver->resolve($resolvedValue);
}

}
Expand Down
Loading