@@ -20,21 +20,65 @@ trait ResolvesJsonApiSpecifications
2020 *
2121 * @var \WeakMap|null
2222 */
23- protected $ cachedLoadedRelationshipsMap ;
23+ protected $ loadedRelationshipsMap ;
2424
2525 /**
2626 * Cached loaded relationships identifers.
27- *
28- * @var array
2927 */
30- protected array $ cachedLoadedRelationshipsIdentifier = [];
28+ protected array $ loadedRelationshipIdentifiers = [];
29+
30+ /**
31+ * Resolves `data` for the resource.
32+ */
33+ public function resolveResourceData (Request $ request ): array
34+ {
35+ return [
36+ 'id ' => $ this ->resolveResourceIdentifier ($ request ),
37+ 'type ' => $ this ->resolveResourceType ($ request ),
38+ ...(new Collection ([
39+ 'attributes ' => $ this ->resolveResourceAttributes ($ request ),
40+ 'relationships ' => $ this ->resolveResourceRelationshipIdentifiers ($ request ),
41+ 'links ' => $ this ->resolveResourceLinks ($ request ),
42+ 'meta ' => $ this ->resolveResourceMetaInformation ($ request ),
43+ ]))->filter ()->map (fn ($ value ) => (object ) $ value ),
44+ ];
45+ }
3146
3247 /**
33- * Resolves `attributes` for the resource's data object .
48+ * Resolve the resource's identifier .
3449 *
35- * @param \Illuminate\Http\Request $request
3650 * @return string|int
3751 *
52+ * @throws ResourceIdentificationException
53+ */
54+ protected function resolveResourceIdentifier (Request $ request ): string
55+ {
56+ if (! $ this ->resource instanceof Model) {
57+ throw ResourceIdentificationException::attemptingToDetermineIdFor ($ this );
58+ }
59+
60+ return static ::resourceIdFromModel ($ this ->resource );
61+ }
62+
63+ /**
64+ * Resolve the resource's type.
65+ *
66+ *
67+ * @throws ResourceIdentificationException
68+ */
69+ protected function resolveResourceType (Request $ request ): string
70+ {
71+ if (! $ this ->resource instanceof Model) {
72+ throw ResourceIdentificationException::attemptingToDetermineTypeFor ($ this );
73+ }
74+
75+ return static ::resourceTypeFromModel ($ this ->resource );
76+ }
77+
78+ /**
79+ * Resolve the resource's attributes.
80+ *
81+ *
3882 * @throws \RuntimeException
3983 */
4084 protected function resolveResourceAttributes (Request $ request ): array
@@ -57,12 +101,11 @@ protected function resolveResourceAttributes(Request $request): array
57101 /**
58102 * Resolves `relationships` for the resource's data object.
59103 *
60- * @param \Illuminate\Http\Request $request
61104 * @return string|int
62105 *
63106 * @throws \RuntimeException
64107 */
65- protected function resolveResourceRelationshipsIdentifiers (Request $ request ): array
108+ protected function resolveResourceRelationshipIdentifiers (Request $ request ): array
66109 {
67110 if (! $ this ->resource instanceof Model) {
68111 return [];
@@ -71,91 +114,43 @@ protected function resolveResourceRelationshipsIdentifiers(Request $request): ar
71114 $ this ->compileResourceRelationships ($ request );
72115
73116 return [
74- ...$ this ->cachedLoadedRelationshipsIdentifier ,
117+ ...$ this ->loadedRelationshipIdentifiers ,
75118 ];
76119 }
77120
78- /**
79- * Resolves `data` for the resource.
80- *
81- * @param \Illuminate\Http\Request $request
82- * @return array
83- */
84- public function resolveResourceData (Request $ request ): array
85- {
86- return [
87- 'id ' => $ this ->resolveResourceIdentifier ($ request ),
88- 'type ' => $ this ->resolveResourceType ($ request ),
89- ...(new Collection ([
90- 'attributes ' => $ this ->resolveResourceAttributes ($ request ),
91- 'relationships ' => $ this ->resolveResourceRelationshipsIdentifiers ($ request ),
92- 'links ' => $ this ->resolveResourceLinks ($ request ),
93- 'meta ' => $ this ->resolveMetaInformations ($ request ),
94- ]))->filter ()->map (fn ($ value ) => (object ) $ value ),
95- ];
96- }
97-
98- /**
99- * Resolves `included` for the resource.
100- *
101- * @param \Illuminate\Http\Request $request
102- * @return array
103- */
104- public function resolveResourceIncluded (Request $ request ): array
105- {
106- $ this ->compileResourceRelationships ($ request );
107-
108- $ relations = new Collection ();
109-
110- foreach ($ this ->cachedLoadedRelationshipsMap as $ relation => $ uniqueKey ) {
111- $ resource = rescue (fn () => $ relation ->toResource (), new JsonApiResource ($ relation ), false );
112-
113- $ relations ->push ([
114- 'id ' => $ uniqueKey [1 ],
115- 'type ' => $ uniqueKey [0 ],
116- 'attributes ' => $ resource ->toArray ($ request ),
117- ]);
118- }
119-
120- return $ relations ->uniqueStrict (fn ($ relation ): array => [$ relation ['id ' ], $ relation ['type ' ]])->all ();
121- }
122-
123121 /**
124122 * Compile resource relationships.
125- *
126- * @param \Illuminate\Http\Request $request
127- * @return void
128123 */
129124 protected function compileResourceRelationships (Request $ request ): void
130125 {
131- if ($ this ->cachedLoadedRelationshipsMap instanceof WeakMap) {
126+ if ($ this ->loadedRelationshipsMap instanceof WeakMap) {
132127 return ;
133128 }
134129
135- $ this ->cachedLoadedRelationshipsMap = new WeakMap ;
130+ $ this ->loadedRelationshipsMap = new WeakMap ;
136131
137- $ this ->cachedLoadedRelationshipsIdentifier = (new Collection ($ this ->resource ->getRelations ()))
132+ $ this ->loadedRelationshipIdentifiers = (new Collection ($ this ->resource ->getRelations ()))
138133 ->mapWithKeys (function ($ relations , $ key ) {
139134 if ($ relations instanceof Collection) {
140135 if ($ relations ->isEmpty ()) {
141136 return [$ key => ['data ' => $ relations ]];
142137 }
143138
144- $ key = static ::getResourceTypeFromEloquent ($ relations ->first ());
139+ $ key = static ::resourceTypeFromModel ($ relations ->first ());
145140
146141 return [$ key => ['data ' => $ relations ->map (function ($ relation ) use ($ key ) {
147- return transform ([$ key , static ::getResourceIdFromEloquent ($ relation )], function ($ uniqueKey ) use ($ relation ) {
148- $ this ->cachedLoadedRelationshipsMap [$ relation ] = $ uniqueKey ;
142+ return transform ([$ key , static ::resourceIdFromModel ($ relation )], function ($ uniqueKey ) use ($ relation ) {
143+ $ this ->loadedRelationshipsMap [$ relation ] = $ uniqueKey ;
149144
150145 return ['id ' => $ uniqueKey [1 ], 'type ' => $ uniqueKey [0 ]];
151146 });
152147 })]];
153148 }
154149
155150 return [$ key => ['data ' => transform (
156- [static ::getResourceTypeFromEloquent ($ relations ), static ::getResourceIdFromEloquent ($ relations )],
151+ [static ::resourceTypeFromModel ($ relations ), static ::resourceIdFromModel ($ relations )],
157152 function ($ uniqueKey ) use ($ relations ) {
158- $ this ->cachedLoadedRelationshipsMap [$ relations ] = $ uniqueKey ;
153+ $ this ->loadedRelationshipsMap [$ relations ] = $ uniqueKey ;
159154
160155 return ['id ' => $ uniqueKey [1 ], 'type ' => $ uniqueKey [0 ]];
161156 }
@@ -164,43 +159,32 @@ function ($uniqueKey) use ($relations) {
164159 }
165160
166161 /**
167- * Resolves `id` for the resource.
168- *
169- * @param \Illuminate\Http\Request $request
170- * @return string|int
171- *
172- * @throws \RuntimeException
162+ * Resolves `included` for the resource.
173163 */
174- protected function resolveResourceIdentifier (Request $ request ): string
164+ public function resolveIncludedResources (Request $ request ): array
175165 {
176- if ($ this ->resource instanceof Model) {
177- return static ::getResourceIdFromEloquent ($ this ->resource );
178- }
166+ $ this ->compileResourceRelationships ($ request );
179167
180- throw ResourceIdentificationException::attemptingToDetermineIdFor ($ this );
181- }
168+ $ relations = new Collection ;
182169
183- /**
184- * Resolves `type` for the resource.
185- *
186- * @param \Illuminate\Http\Request $request
187- * @return string
188- *
189- * @throws \RuntimeException
190- */
191- protected function resolveResourceType (Request $ request ): string
192- {
193- if ($ this ->resource instanceof Model) {
194- return static ::getResourceTypeFromEloquent ($ this ->resource );
170+ foreach ($ this ->loadedRelationshipsMap as $ relation => $ uniqueKey ) {
171+ $ resource = rescue (fn () => $ relation ->toResource (), new JsonApiResource ($ relation ), false );
172+
173+ $ relations ->push ([
174+ 'id ' => $ uniqueKey [1 ],
175+ 'type ' => $ uniqueKey [0 ],
176+ 'attributes ' => $ resource ->toArray ($ request ),
177+ ]);
195178 }
196179
197- throw ResourceIdentificationException::attemptingToDetermineTypeFor ($ this );
180+ return $ relations ->uniqueStrict (
181+ fn ($ relation ): array => [$ relation ['id ' ], $ relation ['type ' ]]
182+ )->all ();
198183 }
199184
200185 /**
201- * Resolves `links` object for the resource.
186+ * Resolve the links for the resource.
202187 *
203- * @param \Illuminate\Http\Request $request
204188 * @return array<string, mixed>
205189 */
206190 protected function resolveResourceLinks (Request $ request ): array
@@ -209,40 +193,34 @@ protected function resolveResourceLinks(Request $request): array
209193 }
210194
211195 /**
212- * Resolves ` meta` object for the resource.
196+ * Resolve the meta information for the resource.
213197 *
214- * @param \Illuminate\Http\Request $request
215198 * @return array<string, mixed>
216199 */
217- protected function resolveMetaInformations (Request $ request ): array
200+ protected function resolveResourceMetaInformation (Request $ request ): array
218201 {
219202 return $ this ->meta ($ request );
220203 }
221204
222205 /**
223- * Get expected resource ID from eloquent model.
224- *
225- * @param \Illuminate\Database\Eloquent\Model $model
226- * @return string
206+ * Get the resource ID from the given Eloquent model.
227207 */
228- protected static function getResourceIdFromEloquent (Model $ model ): string
208+ protected static function resourceIdFromModel (Model $ model ): string
229209 {
230210 return $ model ->getKey ();
231211 }
232212
233213 /**
234- * Get expected resource type from eloquent model.
235- *
236- * @param \Illuminate\Database\Eloquent\Model $model
237- * @return string
214+ * Get the resource type from the given Eloquent model.
238215 */
239- protected static function getResourceTypeFromEloquent (Model $ model ): string
216+ protected static function resourceTypeFromModel (Model $ model ): string
240217 {
241218 $ modelClassName = $ model ::class;
242- $ morphMap = Relation::getMorphAlias ($ modelClassName );
243219
244- $ modelBaseName = $ morphMap !== $ modelClassName ? $ morphMap : class_basename ($ modelClassName );
220+ $ morphMap = Relation:: getMorphAlias ($ modelClassName );
245221
246- return Str::of ($ modelBaseName )->snake ()->pluralStudly ();
222+ return Str::of (
223+ $ morphMap !== $ modelClassName ? $ morphMap : class_basename ($ modelClassName )
224+ )->snake ()->pluralStudly ();
247225 }
248226}
0 commit comments