tinternet.net/src/Router/SiteRouteLoader.php

70 lines
2 KiB
PHP

<?php
namespace App\Router;
use App\Controller\Site\PageController;
use App\Repository\Site\NavigationRepositoryQuery;
use Symfony\Component\Config\Loader\Loader;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
/**
* class SiteRouteLoader.
*
* @author Simon Vieille <simon@deblan.fr>
*/
class SiteRouteLoader extends Loader
{
protected NavigationRepositoryQuery $navigationQuery;
protected $isLoaded = false;
public function __construct(NavigationRepositoryQuery $navigationQuery)
{
$this->navigationQuery = $navigationQuery;
}
public function load($resource, ?string $type = null)
{
if (true === $this->isLoaded) {
throw new \RuntimeException('Do not add the "extra" loader twice');
}
$routes = new RouteCollection();
$navigations = $this->navigationQuery->find();
foreach ($navigations as $navigation) {
foreach ($navigation->getMenus() as $menu) {
foreach ($menu->getRootNode()->getAllChildren() as $node) {
if ($node->getParent() === null) {
continue;
}
$requirements = [];
$defaults = [
'_controller' => PageController::class.'::show',
'_node' => $node->getId(),
'_menu' => $menu->getId(),
'_page' => $node->getPage() ? $node->getPage()->getId() : null,
'_navigation' => $navigation->getId(),
];
$route = new Route($node->getUrl(), $defaults, $requirements);
$route->setHost($navigation->getDomain());
$routes->add($node->getRouteName(), $route);
}
}
}
$this->isLoaded = true;
return $routes;
}
public function supports($resource, string $type = null)
{
return 'extra' === $type;
}
}