86 lines
3.1 KiB
PHP
86 lines
3.1 KiB
PHP
<?php
|
|
|
|
namespace App\Providers;
|
|
|
|
use App\Enums\DynamicPages\PageStatusEnum;
|
|
use Illuminate\Support\ServiceProvider;
|
|
use Illuminate\Support\Facades\Route;
|
|
use App\Models\DynamicPage;
|
|
use Illuminate\Support\Facades\Schema;
|
|
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
|
|
use Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRoutes;
|
|
|
|
class DynamicPageRouteServiceProvider extends ServiceProvider
|
|
{
|
|
/**
|
|
* Register services.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function boot(): void
|
|
{
|
|
if (!Schema::hasTable('dynamic_pages')) {
|
|
return;
|
|
}
|
|
Route::group([
|
|
'prefix' => LaravelLocalization::setLocale(),
|
|
'middleware' => ['web', LaravelLocalizationRoutes::class],
|
|
], function () {
|
|
$dynamicPageModels = DynamicPage::getPublishedDynamicPages();
|
|
DynamicPage::getPublishedDynamicPages()
|
|
->load('parentPage')
|
|
->map(function (DynamicPage $dynamicPageModel) use ($dynamicPageModels) {
|
|
$locale = app()->getLocale();
|
|
$slug = $dynamicPageModel->getTranslation("slug", $locale);
|
|
$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("front.$segmentsSlug$slug");
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 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;
|
|
}
|
|
}
|