Last active
February 11, 2023 18:09
-
-
Save imacrayon/fbaaea06698a2e3cbc8cc8415d70d130 to your computer and use it in GitHub Desktop.
Alpine AJAX Laravel Middleware
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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