Skip to content

Commit 1f84639

Browse files
committed
fixed situation where lazy functions were always being evaluated
1 parent 166f25a commit 1f84639

File tree

2 files changed

+74
-12
lines changed

2 files changed

+74
-12
lines changed

src/Response.php

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -133,27 +133,41 @@ public function toResponse($request)
133133
*/
134134
public function resolveProperties(Request $request, array $props): array
135135
{
136-
$isPartial = $this->isPartial($request);
136+
$props = $this->resolvePartialProperties($props, $request);
137+
$props = $this->resolveArrayableProperties($props, $request);
138+
$props = $this->resolveAlways($props);
139+
$props = $this->resolvePropertyInstances($props, $request);
140+
141+
return $props;
142+
}
137143

138-
if (! $isPartial) {
139-
$props = array_filter($this->props, static function ($prop) {
144+
/**
145+
* Resolve the `only` and `except` partial request props.
146+
*/
147+
public function resolvePartialProperties(array $props, Request $request): array
148+
{
149+
if (! $this->isPartial($request)) {
150+
return array_filter($this->props, static function ($prop) {
140151
return ! ($prop instanceof IgnoreFirstLoad);
141152
});
142153
}
143154

144-
$props = $this->resolveArrayableProperties($props, $request);
155+
$only = array_filter(explode(',', $request->header(Header::PARTIAL_ONLY, '')));
156+
$except = array_filter(explode(',', $request->header(Header::PARTIAL_EXCEPT, '')));
145157

146-
if ($isPartial && $request->hasHeader(Header::PARTIAL_ONLY)) {
147-
$props = $this->resolveOnly($request, $props);
148-
}
158+
if (count($only)) {
159+
$newProps = [];
149160

150-
if ($isPartial && $request->hasHeader(Header::PARTIAL_EXCEPT)) {
151-
$props = $this->resolveExcept($request, $props);
152-
}
161+
foreach ($only as $key) {
162+
Arr::set($newProps, $key, Arr::get($props, $key));
163+
}
153164

154-
$props = $this->resolveAlways($props);
165+
$props = $newProps;
166+
}
155167

156-
$props = $this->resolvePropertyInstances($props, $request);
168+
if ($except) {
169+
Arr::forget($props, $except);
170+
}
157171

158172
return $props;
159173
}

tests/ResponseTest.php

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,54 @@ public function test_resource_response(): void
240240
$this->assertSame('123', $page->version);
241241
}
242242

243+
public function test_lazy_callable_resource_response(): void
244+
{
245+
$request = Request::create('/users', 'GET');
246+
$request->headers->add(['X-Inertia' => 'true']);
247+
248+
$response = new Response('User/Index', [
249+
'users' => fn () => [['name' => 'Jonathan']],
250+
'organizations' => fn () => [['name' => 'Inertia']],
251+
], 'app', '123');
252+
$response = $response->toResponse($request);
253+
$page = $response->getData();
254+
255+
$this->assertInstanceOf(JsonResponse::class, $response);
256+
$this->assertSame('User/Index', $page->component);
257+
$this->assertSame('/users', $page->url);
258+
$this->assertSame('123', $page->version);
259+
tap($page->props->users, function ($users) {
260+
$this->assertSame(json_encode([['name' => 'Jonathan']]), json_encode($users));
261+
});
262+
tap($page->props->organizations, function ($organizations) {
263+
$this->assertSame(json_encode([['name' => 'Inertia']]), json_encode($organizations));
264+
});
265+
}
266+
267+
public function test_lazy_callable_resource_partial_response(): void
268+
{
269+
$request = Request::create('/users', 'GET');
270+
$request->headers->add(['X-Inertia' => 'true']);
271+
$request->headers->add(['X-Inertia-Partial-Data' => 'users']);
272+
$request->headers->add(['X-Inertia-Partial-Component' => 'User/Index']);
273+
274+
$response = new Response('User/Index', [
275+
'users' => fn () => [['name' => 'Jonathan']],
276+
'organizations' => fn () => [['name' => 'Inertia']],
277+
], 'app', '123');
278+
$response = $response->toResponse($request);
279+
$page = $response->getData();
280+
281+
$this->assertInstanceOf(JsonResponse::class, $response);
282+
$this->assertSame('User/Index', $page->component);
283+
$this->assertSame('/users', $page->url);
284+
$this->assertSame('123', $page->version);
285+
$this->assertFalse(property_exists($page->props, 'organizations'));
286+
tap($page->props->users, function ($users) {
287+
$this->assertSame(json_encode([['name' => 'Jonathan']]), json_encode($users));
288+
});
289+
}
290+
243291
public function test_lazy_resource_response(): void
244292
{
245293
$request = Request::create('/users', 'GET', ['page' => 1]);

0 commit comments

Comments
 (0)