routes(function (): void { Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/web.php')); }); Route::bind('gammeSlug', function ($value) { /** @var string $locale @var string $defaultLocale @var string $value */ $vars = $this->getRouteBinderVars($value); \extract($vars); /** @var \App\Models\Gamme */ $gamme = Gamme::where(function (Builder $q) use ($locale, $defaultLocale, $value): void { $q->whereRaw("JSON_EXTRACT(slug, '$.$locale') = '$value'") ->orWhereRaw("JSON_EXTRACT(slug, '$.$defaultLocale') = '$value'"); })->firstOrFail(); return $gamme->setLocale($locale); }); Route::bind('productSlug', function ($value, $route) { /** @var \Illuminate\Routing\Route $route */ $gamme = $route->parameter('gammeSlug'); /** @var string $locale @var string $defaultLocale @var string $value */ $vars = $this->getRouteBinderVars($value); \extract($vars); /** @var \App\Models\Product */ $product = Product::where(function (Builder $q) use ($locale, $defaultLocale, $value): void { $q->whereRaw("JSON_EXTRACT(slug, '$.$locale') = '$value'") ->orWhereRaw("JSON_EXTRACT(slug, '$.$defaultLocale') = '$value'"); })->where('gamme_id', $gamme->id) ->firstOrFail(); return $product->setLocale($locale); }); } /** * Get route binder common * @param string $value * @return string[] */ private function getRouteBinderVars(string $value): array { $locale = \app()->getLocale(); $defaultLocale = \config('translatable.fallback_locale'); $value = \filter_var($value, \FILTER_SANITIZE_STRING); return compact('locale', 'defaultLocale', 'value'); } }