<?php
namespace WAM\Bundle\RoutingBundle\Sitemap;
use Symfony\Cmf\Component\RoutingAuto\Model\AutoRouteInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use WAM\Bundle\CoreBundle\Manager\LocaleManager;
use WAM\Bundle\RoutingBundle\Entity\Interfaces\RouteInterface;
use WAM\Bundle\RoutingBundle\Repository\Interfaces\RouteRepositoryInterface;
use WAM\Bundle\RoutingBundle\Sitemap\Interfaces\AlternatesGeneratorInterface;
/**
* Class RouteAlternatesGenerator.
*
* @author Miguel Vilata <mvilata@wearemarketing.com>
* @author David Velasco <dvelasco@wearemarketing.com>
*/
class RouteAlternatesGenerator implements AlternatesGeneratorInterface
{
/**
* @var RouteRepositoryInterface
*/
private $routeRepository;
/**
* @var UrlGeneratorInterface
*/
private $urlGenerator;
/**
* @var LocaleManager
*/
private $localeManager;
/**
* RouteAlternatesGenerator constructor.
*
* @param RouteRepositoryInterface $routeRepository
* @param UrlGeneratorInterface $urlGenerator
* @param LocaleManager $localeManager
*/
public function __construct(
RouteRepositoryInterface $routeRepository,
UrlGeneratorInterface $urlGenerator,
LocaleManager $localeManager
)
{
$this->routeRepository = $routeRepository;
$this->urlGenerator = $urlGenerator;
$this->localeManager = $localeManager;
}
/**
* {@inheritdoc}
*/
public function getAlternateRoutes($route)
{
if (!$this->handles($route)) {
return [];
}
$routes = $this->getRoutesByCanonical($route->getCanonicalName());
if (count($routes) < 2) {
return [];
}
$alternates = [];
$alternateDefault = [];
foreach ($routes as $routeObject) {
if ($this->localeManager->isDisabledLocale($routeObject->getLocale())) {
continue;
}
$hreflang = $this->localeManager->getHreflang($routeObject->getLocale());
$url = $this->generateUrl($routeObject, ['_locale' => $routeObject->getTag()]);
$alternates[] = [
'url' => $url,
'hreflang' => $hreflang,
];
if ($this->localeManager->isDefaultHreflang($hreflang)) {
$alternateDefault[] = [
'url' => $url,
'hreflang' => AlternatesGeneratorInterface::HREFLANG_X_DEFAULT,
];
}
}
if (count($alternates) < 2) {
return [];
}
return array_merge($alternates, $alternateDefault);
}
public function handles($route)
{
return $route instanceof RouteInterface;
}
public function isSitemapRoute($route, $locale)
{
if ($route->getType() == AutoRouteInterface::TYPE_REDIRECT) {
return false;
}
if ($route->getLocale() != $locale) {
return false;
}
return $route->getSitemapeable();
}
public function getMainRouteUrl($route, $locale)
{
return $this->generateUrl($route, ['_locale' => $locale]);
}
/**
* @param string $canonicalName
*
* @return RouteInterface[]
*/
private function getRoutesByCanonical(string $canonicalName): array
{
return $this->routeRepository->findPrimaryByCanonicalName($canonicalName);
}
/**
* @param RouteInterface $routeObject
* @param array $parameters
*
* @return string
*/
private function generateUrl(RouteInterface $routeObject, array $parameters = []): string
{
return $this->urlGenerator->generate($routeObject, $parameters, UrlGeneratorInterface::ABSOLUTE_URL);
}
}