Skip to content

Commit 4abf43a

Browse files
crynoboneStyleCIBottaylorotwell
authored
[JSON:API] Add toAttributes() method (#57603)
* [JSON:API] Add `toAttributes()` method Signed-off-by: Mior Muhammad Zaki <crynobone@gmail.com> * wip Signed-off-by: Mior Muhammad Zaki <crynobone@gmail.com> * wip Signed-off-by: Mior Muhammad Zaki <crynobone@gmail.com> * Apply fixes from StyleCI * wip Signed-off-by: Mior Muhammad Zaki <crynobone@gmail.com> * formatting --------- Signed-off-by: Mior Muhammad Zaki <crynobone@gmail.com> Co-authored-by: StyleCI Bot <bot@styleci.io> Co-authored-by: Taylor Otwell <taylor@laravel.com>
1 parent 8e20f20 commit 4abf43a

File tree

6 files changed

+48
-21
lines changed

6 files changed

+48
-21
lines changed

src/Illuminate/Http/Resources/Json/JsonResource.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ protected static function newCollection($resource)
111111
*/
112112
public function resolve($request = null)
113113
{
114-
$data = $this->toArray(
114+
$data = $this->toAttributes(
115115
$request ?: Container::getInstance()->make('request')
116116
);
117117

@@ -124,6 +124,17 @@ public function resolve($request = null)
124124
return $this->filter((array) $data);
125125
}
126126

127+
/**
128+
* Transform the resource into an array.
129+
*
130+
* @param \Illuminate\Http\Request $request
131+
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
132+
*/
133+
public function toAttributes(Request $request)
134+
{
135+
return $this->toArray($request);
136+
}
137+
127138
/**
128139
* Transform the resource into an array.
129140
*

src/Illuminate/Http/Resources/Json/ResourceCollection.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,9 @@ public function count(): int
9696
* @param \Illuminate\Http\Request $request
9797
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
9898
*/
99-
public function toArray(Request $request)
99+
public function toAttributes(Request $request)
100100
{
101-
return $this->collection->map->toArray($request)->all();
101+
return $this->collection->map->resolve($request)->all();
102102
}
103103

104104
/**

src/Illuminate/Http/Resources/JsonApi/AnonymousResourceCollection.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public function with($request)
3535
* @return array
3636
*/
3737
#[\Override]
38-
public function toArray(Request $request)
38+
public function toAttributes(Request $request)
3939
{
4040
return $this->collection
4141
->map(fn ($resource) => $resource->resolveResourceData($request))

src/Illuminate/Http/Resources/JsonApi/Concerns/ResolvesJsonApiElements.php

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
use Illuminate\Database\Eloquent\Model;
77
use Illuminate\Database\Eloquent\Relations\Relation;
88
use Illuminate\Http\Request;
9+
use Illuminate\Http\Resources\Json\JsonResource;
910
use Illuminate\Http\Resources\JsonApi\Exceptions\ResourceIdentificationException;
1011
use Illuminate\Http\Resources\JsonApi\JsonApiResource;
12+
use Illuminate\Support\Arr;
1113
use Illuminate\Support\Collection;
1214
use Illuminate\Support\Str;
1315
use JsonSerializable;
@@ -53,6 +55,10 @@ public function resolveResourceData(Request $request): array
5355
*/
5456
protected function resolveResourceIdentifier(Request $request): string
5557
{
58+
if (! is_null($resourceId = $this->toId($request))) {
59+
return $resourceId;
60+
}
61+
5662
if (! $this->resource instanceof Model) {
5763
throw ResourceIdentificationException::attemptingToDetermineIdFor($this);
5864
}
@@ -68,6 +74,10 @@ protected function resolveResourceIdentifier(Request $request): string
6874
*/
6975
protected function resolveResourceType(Request $request): string
7076
{
77+
if (! is_null($resourceType = $this->toType($request))) {
78+
return $resourceType;
79+
}
80+
7181
if (! $this->resource instanceof Model) {
7282
throw ResourceIdentificationException::attemptingToDetermineTypeFor($this);
7383
}
@@ -83,7 +93,7 @@ protected function resolveResourceType(Request $request): string
8393
*/
8494
protected function resolveResourceAttributes(Request $request): array
8595
{
86-
$data = $this->toArray($request);
96+
$data = $this->toAttributes($request);
8797

8898
if ($data instanceof Arrayable) {
8999
$data = $data->toArray();
@@ -92,6 +102,7 @@ protected function resolveResourceAttributes(Request $request): array
92102
}
93103

94104
$data = (new Collection($data))
105+
->mapWithKeys(fn ($value, $key) => is_int($key) ? [$value => $this->resource->{$value}] : [$key => $value])
95106
->transform(fn ($value) => value($value, $request))
96107
->all();
97108

@@ -168,12 +179,17 @@ public function resolveIncludedResources(Request $request): array
168179
$relations = new Collection;
169180

170181
foreach ($this->loadedRelationshipsMap as $relation => $uniqueKey) {
171-
$resource = rescue(fn () => $relation->toResource(), new JsonApiResource($relation), false);
182+
$resourceInstance = rescue(fn () => $relation->toResource(), new JsonApiResource($relation), false);
183+
184+
if (! $resourceInstance instanceof JsonApiResource &&
185+
$resourceInstance instanceof JsonResource) {
186+
$resourceInstance = new JsonApiResource($resourceInstance->resource);
187+
}
172188

173189
$relations->push([
174190
'id' => $uniqueKey[1],
175191
'type' => $uniqueKey[0],
176-
'attributes' => $resource->toArray($request),
192+
'attributes' => Arr::get($resourceInstance->resolve($request), 'data.attributes', []),
177193
]);
178194
}
179195

@@ -189,7 +205,7 @@ public function resolveIncludedResources(Request $request): array
189205
*/
190206
protected function resolveResourceLinks(Request $request): array
191207
{
192-
return $this->links($request);
208+
return $this->toLinks($request);
193209
}
194210

195211
/**
@@ -199,7 +215,7 @@ protected function resolveResourceLinks(Request $request): array
199215
*/
200216
protected function resolveResourceMetaInformation(Request $request): array
201217
{
202-
return $this->meta($request);
218+
return $this->toMeta($request);
203219
}
204220

205221
/**

src/Illuminate/Http/Resources/JsonApi/JsonApiResource.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,29 +54,29 @@ public static function configure(?string $version = null, array $ext = [], array
5454
/**
5555
* Get the resource's ID.
5656
*
57-
* @return string
57+
* @return string|null
5858
*/
59-
public function id(Request $request)
59+
public function toId(Request $request)
6060
{
61-
return $this->resolveResourceIdentifier($request);
61+
return null;
6262
}
6363

6464
/**
6565
* Get the resource's type.
6666
*
67-
* @return string
67+
* @return string|null
6868
*/
69-
public function type(Request $request)
69+
public function toType(Request $request)
7070
{
71-
return $this->resolveResourceType($request);
71+
return null;
7272
}
7373

7474
/**
7575
* Get the resource's links.
7676
*
7777
* @return array
7878
*/
79-
public function links(Request $request)
79+
public function toLinks(Request $request)
8080
{
8181
return $this->jsonApiLinks;
8282
}
@@ -86,7 +86,7 @@ public function links(Request $request)
8686
*
8787
* @return array
8888
*/
89-
public function meta(Request $request)
89+
public function toMeta(Request $request)
9090
{
9191
return $this->jsonApiMeta;
9292
}

tests/Integration/Http/Resources/JsonApi/JsonApiResourceTest.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ public function toArray(Request $request)
166166

167167
class UserApiResource extends JsonApiResource
168168
{
169-
public function toArray(Request $request)
169+
public function toAttributes(Request $request)
170170
{
171171
return [
172172
'name' => $this->name,
@@ -186,11 +186,11 @@ public function user()
186186

187187
class PostApiResource extends JsonApiResource
188188
{
189-
public function toArray(Request $request)
189+
public function toAttributes(Request $request)
190190
{
191191
return [
192-
'title' => $this->title,
193-
'content' => $this->content,
192+
'title',
193+
'content',
194194
];
195195
}
196196
}

0 commit comments

Comments
 (0)