<?php
declare(strict_types=1);
namespace App\Module\Cms\Routing;
use App\Module\Cms\Provider\CmsContentProvider;
use BestIt\Routing\Router\AbstractRouter;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\Routing\Exception\RouteNotFoundException;
/**
* Router for cms pages
*
* @author André Varelmann <andre.varelmann@bestit-online.de>
* @package App\Module\Cms\Routing
*/
class CmsRouter extends AbstractRouter
{
private CmsContentProvider $provider;
/**
* CmsRouter constructor.
*
* @param CmsContentProvider $provider
*/
public function __construct(CmsContentProvider $provider)
{
$this->provider = $provider;
}
/**
* Generates a URL or path for a specific route based on the given parameters.
*
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*
* @throws RouteNotFoundException
*
* @return string
*/
public function generate(string $name, array $parameters = [], int $referenceType = self::ABSOLUTE_PATH): string
{
throw new RouteNotFoundException('Not implemented. This router only handles cms routes');
}
/**
* Tries to match a URL path with a set of routes.
*
* @param string $pathinfo
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
*
* @return array
*/
public function match(string $pathinfo): array
{
$content = $this->provider->getContentBySlugForCurrentPage();
if ($content !== null) {
return [
'_controller' => 'App\Module\Cms\Action\GetContentAction::__invoke',
'cmsContent' => $content
];
}
if (preg_match('#(/.{2})?/story/(?<story>\d{8,15})?#i', $pathinfo, $matches) && !empty($matches['story'])) {
$content = $this->provider->getContentById($matches['story']);
if ($content !== null) {
return [
'_controller' => 'Symfony\\Bundle\\FrameworkBundle\\Controller\\RedirectController::urlRedirectAction',
'path' => $content->slug ,
'permanent' => true,
];
}
}
throw new ResourceNotFoundException('Path could not be matched.');
}
}