inertiajs / inertia-laravel

The Laravel adapter for Inertia.js.
https://inertiajs.com
MIT License
1.99k stars 222 forks source link

[1.x] Make inertia response more extension friendly #632

Open VicGUTT opened 1 month ago

VicGUTT commented 1 month ago

This PR simply aims to make Inertia\Response more friendly to extension/customization by:

This unlocks, for example, customizing how the page.url get's resolved by Inertia.

In a particular case, it was necessary for me to ensure redirections keept the url fragment (/abc#123).

Previously I had to:

Example implementation ```php inertia()) { return $next($request); } $requestedFrom = $request->headers->get('x-requested-from'); if (!$requestedFrom) { return $next($request); } $response = $next($request); if (!($response instanceof JsonResponse)) { return $response; } $parsedRequestedFrom = parse_url($requestedFrom); if (!is_array($parsedRequestedFrom)) { return $response; } if (!isset($parsedRequestedFrom['path'])) { return $response; } if (!isset($parsedRequestedFrom['fragment'])) { return $response; } $requestedFromUri = $parsedRequestedFrom['path'] . ( isset($parsedRequestedFrom['query']) ? "?{$parsedRequestedFrom['query']}" : '' ); $page = $response->getOriginalContent(); if ($requestedFromUri !== $page['url']) { return $response; } $page['url'] = "{$page['url']}#{$parsedRequestedFrom['fragment']}"; $response->setData($page); return $response; } } ```

Now, a custom Response class overwritting the resolveUrl method could be resolved from the container whenever an Inertia response is returned.

Example implementation ```php use Illuminate\Http\Request; use Illuminate\Foundation\Application; use Illuminate\Support\ServiceProvider; use Inertia\Response as InertiaResponse; final class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. */ public function boot(): void { $this->app->bind(InertiaResponse::class, CustomInertiaResponse::class); } } final class CustomInertiaResponse extends InertiaResponse { public function resolveUrl(Request $request, array $props): string { $url = '...'; return $url; } } ```
VicGUTT commented 1 month ago

Resolved any conflicts that arose after https://github.com/inertiajs/inertia-laravel/pull/641. This PR is now up to date with the 1.x branch.