Skip to content

Commit 9e41353

Browse files
committed
feat: improve schema & correct attributes generation
1 parent baa41b0 commit 9e41353

File tree

2 files changed

+20
-10
lines changed

2 files changed

+20
-10
lines changed

src/Resources/Concerns/Schema.php

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,25 @@
55
use Ark4ne\JsonApi\Resources\JsonApiCollection;
66
use Ark4ne\JsonApi\Support\FakeModel;
77
use Illuminate\Http\Request;
8+
use ReflectionClass;
89

910
trait Schema
1011
{
1112
private static array $schemas = [];
1213

1314
public static function schema(Request $request = null): object
1415
{
15-
$request ??= new Request;
16+
if (isset(self::$schemas[static::class])) {
17+
return self::$schemas[static::class];
18+
}
1619

17-
$resource = new static(new FakeModel);
20+
$resource = self::new();
1821

1922
if ($resource instanceof JsonApiCollection) {
2023
return $resource->collects::schema($request);
2124
}
2225

23-
if (isset(self::$schemas[static::class])) {
24-
return self::$schemas[static::class];
25-
}
26+
$request ??= new Request;
2627

2728
$schema = (object)[
2829
'type' => null,
@@ -33,12 +34,21 @@ public static function schema(Request $request = null): object
3334
self::$schemas[static::class] = $schema;
3435

3536
$schema->type = $resource->toType($request);
36-
$schema->fields = array_keys($resource->toAttributes($request));
37+
$schema->fields = collect($resource->toAttributes($request))->keys()->all();
3738

3839
foreach ($resource->toRelationships($request) as $name => $relation) {
3940
$schema->relationships[$name] = $relation->getResource()::schema();
4041
}
4142

4243
return self::$schemas[static::class];
4344
}
45+
46+
private static function new(): self
47+
{
48+
/** @var self $instance */
49+
$instance = (new ReflectionClass(static::class))->newInstanceWithoutConstructor();
50+
$instance->resource = new FakeModel;
51+
52+
return $instance;
53+
}
4454
}

tests/app/Http/Resources/CommentResource.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,17 @@ protected function toType(Request $request): string
1818

1919
protected function toAttributes(Request $request): iterable
2020
{
21-
return [
21+
return collect([
2222
'content' => fn() => $this->resource->content,
23-
];
23+
]);
2424
}
2525

2626
protected function toResourceMeta(Request $request): ?iterable
2727
{
28-
return [
28+
return collect([
2929
'created_at' => $this->resource->created_at->format(DateTimeInterface::ATOM),
3030
'updated_at' => $this->resource->updated_at->format(DateTimeInterface::ATOM),
31-
];
31+
]);
3232
}
3333

3434
protected function toRelationships(Request $request): iterable

0 commit comments

Comments
 (0)