Skip to content

Instantly share code, notes, and snippets.

@imacrayon
Last active February 11, 2023 18:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save imacrayon/fbaaea06698a2e3cbc8cc8415d70d130 to your computer and use it in GitHub Desktop.
Save imacrayon/fbaaea06698a2e3cbc8cc8415d70d130 to your computer and use it in GitHub Desktop.
Alpine AJAX Laravel Middleware
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Contracts\Http\Kernel;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Facade;
use Illuminate\Validation\ValidationException;
class AlpineAjax
{
public function handle(Request $request, Closure $next)
{
$response = $next($request);
if (! $request->hasHeader('X-Alpine-AJAX')) {
return $response;
}
if (! $response instanceof RedirectResponse) {
return $response;
}
if (! $response->exception instanceof ValidationException) {
return $response->setStatusCode(303);
}
return tap($this->handleRedirectInternally($response, $request), function () use ($request) {
App::instance('request', $request);
Facade::clearResolvedInstance('request');
});
}
protected function handleRedirectInternally($response, $request)
{
$kernel = $this->kernel();
$response->setTargetUrl(url()->previous());
do {
$response = $kernel->handle(
$request = $this->createRequestFrom($response, $request)
);
} while ($response->isRedirect());
if ($response->isOk()) {
$response->setStatusCode(422);
}
return $response;
}
protected function kernel()
{
return App::make(Kernel::class);
}
private function createRequestFrom($response, $baseRequest)
{
$request = Request::create($response->headers->get('Location'), 'GET');
$request->headers->replace($baseRequest->headers->all());
$responseCookies = collect($response->headers->getCookies())
->mapWithKeys(fn ($cookie) => [$cookie->getName() => $cookie->getValue()])
->all();
$request->cookies->replace(array_replace_recursive($baseRequest->cookies->all(), $responseCookies));
return $request;
}
}
// Register your middleware in the Http Kernal (app/Http/Middleware/Kernal.php)
//...
protected $middlewareGroups = [
'web' => [
// ...
\App\Http\Middleware\AlpineAjax::class,
],
//...
];
// ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment