LaravelLocalization::setLocale(), 'middleware' => ['web', LaravelLocalizationRoutes::class], ], function () { $dynamicPageModels = DynamicPage::getPublishedDynamicPages(); DynamicPage::getPublishedDynamicPages() ->load('parentPage') ->map(function (DynamicPage $dynamicPageModel) use ($dynamicPageModels) { foreach ($dynamicPageModel->getTranslations("slug") as $locale => $slug) { $segments = self::buildFullUrlFromGroups($dynamicPageModel, $dynamicPageModels->keyBy('id'), $locale); $segmentsSlug = $segments ? implode('.', $segments) . "." : ""; $segmentsPath = implode('/', $segments); $definitivePath = sprintf("%s/%s", sprintf("/%s", $segmentsPath), $slug); Route::get($definitivePath, function () use ($dynamicPageModel) { return view($dynamicPageModel->getView(), compact('dynamicPageModel')); })->name(sprintf("front.dynamic-pages.%s", $dynamicPageModel->id_key)); } }); }); } /** * Get all segments from parent pages. * * @param \App\Models\DynamicPage $page * @param \Illuminate\Database\Eloquent\Collection $groupsKeyedById * @param string $locale * @return array */ private function buildFullUrlFromGroups( DynamicPage $page, \Illuminate\Database\Eloquent\Collection $groupsKeyedById, string $locale = 'fr' ): array { $segments = []; // On part du page_id du DynamicPage. $parentPageId = $page->page_id ?? ($page->parentPage->id ?? null); // Browse all relationships. while ($parentPageId) { /** @var \App\Models\DynamicPage|null $parentPage */ $parentPage = $groupsKeyedById->find($parentPageId); if (!$parentPage) { break; } // Save parentPage slug if it is published. if ($parentPage->status->equals(PageStatusEnum::published)) { $slug = $parentPage->getTranslation('slug', $locale) ?? null; if ($slug) { array_unshift($segments, $slug); } } // Continue to move up even if the parentPage is not published. $parentPageId = $parentPage->page_id; } //end while return $segments; } }