@@ -23,6 +23,8 @@ class RequestFactory
2323{
2424 private PhpArrayToResourceEncoderInterface $ resourceEncoder ;
2525 private RequestValidator $ requestValidator ;
26+ /** @var array<string, mixed> */
27+ private array $ requestData = [];
2628
2729 public function __construct (
2830 PhpArrayToResourceEncoderInterface $ resourceEncoder ,
@@ -45,12 +47,22 @@ public function createResourceRequest(
4547 $ this ->requestValidator ->assertValidRequest ($ request );
4648 $ requestPrimaryData = $ this ->getRequestPrimaryData ($ request );
4749
48- // If the server-side ID is passed as argument, we don't expect the Client to generate ID
49- // https://jsonapi.org/format/#crud-creating-client-ids
50+ /** If the server-side ID is passed as argument, we don't expect the Client to generate ID
51+ * @see https://jsonapi.org/format/#crud-creating-client-ids
52+ */
5053 if (null !== $ id ) {
5154 $ this ->requestValidator ->assertResourceIsWithoutClientGeneratedId ($ requestPrimaryData );
5255 $ requestPrimaryData ['id ' ] = $ id ;
5356 }
57+ /**
58+ * If we have lid sent as id we will pass it as resource id
59+ * @see https://jsonapi.org/format/#document-resource-object-identification
60+ */
61+ $ lid = $ this ->getResourceLid ($ request );
62+ if (null !== $ lid ) {
63+ $ requestPrimaryData ['id ' ] = $ lid ;
64+ unset($ requestPrimaryData ['lid ' ]);
65+ }
5466
5567 $ resource = $ this ->resourceEncoder ->decode ($ requestPrimaryData );
5668
@@ -136,15 +148,28 @@ public function updateResourceRequest(Request $request, string $id): UpdateResou
136148 */
137149 private function getRequestPrimaryData (Request $ request ): array
138150 {
151+ if (false === empty ($ this ->requestData )) {
152+ return $ this ->requestData ;
153+ }
154+
139155 /** @var string $rawRequestData */
140- $ rawRequestData = $ request ->getContent (false );
156+ $ rawRequestData = $ request ->getContent ();
141157 Assertion::isJsonString ($ rawRequestData , 'Request data must be valid JSON ' );
142158 $ requestData = json_decode ($ rawRequestData , true );
143159
144160 Assertion::notNull ($ requestData , 'Request data must be parsable to a valid array ' );
145161 Assertion::isArray ($ requestData , 'Request data must be parsable to a valid array ' );
146162 Assertion::keyExists ($ requestData , 'data ' , 'The request MUST include a single resource object as primary data ' );
163+ $ this ->requestData = $ requestData ['data ' ];
147164
148165 return $ requestData ['data ' ];
149166 }
167+
168+ private function getResourceLid (Request $ request ): ?string
169+ {
170+ $ requestPrimaryData = $ this ->getRequestPrimaryData ($ request );
171+ $ this ->requestValidator ->assertResourceLidIsValid ($ requestPrimaryData );
172+
173+ return $ requestPrimaryData ['lid ' ] ?? null ;
174+ }
150175}
0 commit comments