From 48dc73a9c38420489f5050f29d967e7c5e7e82c3 Mon Sep 17 00:00:00 2001 From: Ivan Vermeyen Date: Sat, 8 Apr 2023 21:19:06 +0200 Subject: [PATCH 1/3] Attempt to create a fresh Request from the current URL --- src/Middleware/SetLocale.php | 50 ++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/Middleware/SetLocale.php b/src/Middleware/SetLocale.php index 67e7956..db5979d 100644 --- a/src/Middleware/SetLocale.php +++ b/src/Middleware/SetLocale.php @@ -3,6 +3,13 @@ namespace CodeZero\LocalizedRoutes\Middleware; use Closure; +use CodeZero\LocalizedRoutes\LocalizedUrlGenerator; +use CodeZero\LocalizedRoutes\Middleware\Detectors\RouteActionDetector; +use CodeZero\LocalizedRoutes\Middleware\Detectors\UrlDetector; +use CodeZero\LocalizedRoutes\RouteHelper; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\App; +use Illuminate\Support\Facades\Route; class SetLocale { @@ -33,12 +40,55 @@ public function __construct(LocaleHandler $handler) */ public function handle($request, Closure $next) { + $originalRequest = $this->useOriginalRequestDuringLivewireRequests($request); + $locale = $this->handler->detect(); if ($locale) { $this->handler->store($locale); } + // This is rom the SubstituteBindings middleware, but + // it needs to run on the request we created, + // after the locale is updated. + Route::substituteBindings($originalRequest->route()); + Route::substituteImplicitBindings($originalRequest->route()); + return $next($request); } + + /** + * Handle an incoming request. + * + * @param \Illuminate\Http\Request $request + * + * @return mixed + */ + public function useOriginalRequestDuringLivewireRequests(Request $request) + { + $url = $request->fullUrl();// Livewire::originalUrl(); + $originalRequest = Request::create($url); + + $originalRequest->setRouteResolver(function () use ($originalRequest) { + return Route::getRoutes()->match($originalRequest); + }); + + App::bind(LocalizedUrlGenerator::class, function () use ($originalRequest) { + return new LocalizedUrlGenerator($originalRequest); + }); + + App::bind(RouteActionDetector::class, function () use ($originalRequest) { + return new RouteActionDetector($originalRequest); + }); + + App::bind(UrlDetector::class, function () use ($originalRequest) { + return new UrlDetector($originalRequest); + }); + + App::bind(RouteHelper::class, function () use ($originalRequest) { + return new RouteHelper($originalRequest); + }); + + return $originalRequest; + } } From 77c8e47a416d4b89642affcb68cb80f0bb4cfb49 Mon Sep 17 00:00:00 2001 From: Ivan Vermeyen Date: Sat, 8 Apr 2023 21:58:01 +0200 Subject: [PATCH 2/3] Conditionally create Request --- src/Middleware/SetLocale.php | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/Middleware/SetLocale.php b/src/Middleware/SetLocale.php index db5979d..8315745 100644 --- a/src/Middleware/SetLocale.php +++ b/src/Middleware/SetLocale.php @@ -48,11 +48,13 @@ public function handle($request, Closure $next) $this->handler->store($locale); } - // This is rom the SubstituteBindings middleware, but - // it needs to run on the request we created, - // after the locale is updated. - Route::substituteBindings($originalRequest->route()); - Route::substituteImplicitBindings($originalRequest->route()); + if ($originalRequest) { + // This is rom the SubstituteBindings middleware, but + // it needs to run on the request we created, + // after the locale is updated. + Route::substituteBindings($originalRequest->route()); + Route::substituteImplicitBindings($originalRequest->route()); + } return $next($request); } @@ -66,6 +68,10 @@ public function handle($request, Closure $next) */ public function useOriginalRequestDuringLivewireRequests(Request $request) { + if ( ! $this->isLivewireRequest()) { + //return null; + } + $url = $request->fullUrl();// Livewire::originalUrl(); $originalRequest = Request::create($url); @@ -91,4 +97,15 @@ public function useOriginalRequestDuringLivewireRequests(Request $request) return $originalRequest; } + + /** + * Check if this is a Livewire ajax call. + * + * @return bool + */ + protected function isLivewireRequest(): bool + { + return class_exists(\Livewire\LivewireManager::class) + && $this->app->make(\Livewire\LivewireManager::class)->isLivewireRequest(); + } } From d7b92c5f57e99608802a99e5ccea0f62e2453350 Mon Sep 17 00:00:00 2001 From: Ivan Vermeyen Date: Sun, 9 Apr 2023 13:13:08 +0200 Subject: [PATCH 3/3] Recreate Request on Livewire requests only --- src/Middleware/SetLocale.php | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/Middleware/SetLocale.php b/src/Middleware/SetLocale.php index 8315745..34a7f5c 100644 --- a/src/Middleware/SetLocale.php +++ b/src/Middleware/SetLocale.php @@ -38,9 +38,13 @@ public function __construct(LocaleHandler $handler) * * @return mixed */ - public function handle($request, Closure $next) + public function handle(Request $request, Closure $next) { - $originalRequest = $this->useOriginalRequestDuringLivewireRequests($request); + // If this is a Livewire request, we have to recreate + // the original Request and rebind the classes that need it. + // This needs to be done before the locale is updated, + // because some Detector classes use the Request. + $originalRequest = $this->useOriginalRequestDuringLivewireRequests(); $locale = $this->handler->detect(); @@ -49,9 +53,10 @@ public function handle($request, Closure $next) } if ($originalRequest) { - // This is rom the SubstituteBindings middleware, but - // it needs to run on the request we created, - // after the locale is updated. + // This is from the SubstituteBindings middleware. + // If this is a Livewire request, this needs to run on + // the request we created, after the locale is updated, + // to enable localized route model binding. Route::substituteBindings($originalRequest->route()); Route::substituteImplicitBindings($originalRequest->route()); } @@ -60,19 +65,18 @@ public function handle($request, Closure $next) } /** - * Handle an incoming request. - * - * @param \Illuminate\Http\Request $request + * If this is a Livewire request, recreate the original Request, + * and use it in the classes that need it. * - * @return mixed + * @return \Illuminate\Http\Request|null */ - public function useOriginalRequestDuringLivewireRequests(Request $request) + public function useOriginalRequestDuringLivewireRequests(): ?Request { if ( ! $this->isLivewireRequest()) { - //return null; + return null; } - $url = $request->fullUrl();// Livewire::originalUrl(); + $url = \Livewire\Livewire::originalUrl(); $originalRequest = Request::create($url); $originalRequest->setRouteResolver(function () use ($originalRequest) { @@ -106,6 +110,6 @@ public function useOriginalRequestDuringLivewireRequests(Request $request) protected function isLivewireRequest(): bool { return class_exists(\Livewire\LivewireManager::class) - && $this->app->make(\Livewire\LivewireManager::class)->isLivewireRequest(); + && App::make(\Livewire\LivewireManager::class)->isLivewireRequest(); } }