function () use ($request) { return $this->resolveValidationErrors($request); }, ]; } /** * Sets the root template that's loaded on the first page visit. * * @see https://inertiajs.com/server-side-setup#root-template * * @return string */ public function rootView(Request $request) { return $this->rootView; } /** * Handle the incoming request. * * @return Response */ public function handle(Request $request, Closure $next) { Inertia::version(function () use ($request) { return $this->version($request); }); Inertia::share($this->share($request)); Inertia::setRootView($this->rootView($request)); $response = $next($request); $response->headers->set('Vary', 'X-Inertia'); if (! $request->header('X-Inertia')) { return $response; } if ($request->method() === 'GET' && $request->header('X-Inertia-Version', '') !== Inertia::getVersion()) { $response = $this->onVersionChange($request, $response); } if ($response->isOk() && empty($response->getContent())) { $response = $this->onEmptyResponse($request, $response); } if ($response->getStatusCode() === 302 && in_array($request->method(), ['PUT', 'PATCH', 'DELETE'])) { $response->setStatusCode(303); } return $response; } /** * Determines what to do when an Inertia action returned with no response. * By default, we'll redirect the user back to where they came from. */ public function onEmptyResponse(Request $request, Response $response): Response { return Redirect::back(); } /** * Determines what to do when the Inertia asset version has changed. * By default, we'll initiate a client-side location visit to force an update. */ public function onVersionChange(Request $request, Response $response): Response { if ($request->hasSession()) { $request->session()->reflash(); } return Inertia::location($request->fullUrl()); } /** * Resolves and prepares validation errors in such * a way that they are easier to use client-side. * * @return object */ public function resolveValidationErrors(Request $request) { if (! $request->hasSession() || ! $request->session()->has('errors')) { return (object) []; } return (object) collect($request->session()->get('errors')->getBags())->map(function ($bag) { return (object) collect($bag->messages())->map(function ($errors) { return $errors[0]; })->toArray(); })->pipe(function ($bags) use ($request) { if ($bags->has('default') && $request->header('x-inertia-error-bag')) { return [$request->header('x-inertia-error-bag') => $bags->get('default')]; } if ($bags->has('default')) { return $bags->get('default'); } return $bags->toArray(); }); } }