deblan.tv/vendor/trinity/src/Trinity/Bundle/ContentManagerBundle/Routing/Router.php
2015-03-02 21:57:49 +01:00

74 lines
2.4 KiB
PHP

<?php
namespace Trinity\Bundle\ContentManagerBundle\Routing;
use Symfony\Bundle\FrameworkBundle\Routing\Router as BaseRouter;
use Symfony\Component\Routing\Exception\RouteNotFoundException;
use Trinity\Bundle\ContentManagerBundle\Page\PageManager;
use Trinity\Bundle\ContentManagerBundle\Model\NavQuery;
use Trinity\Bundle\ContentManagerBundle\Exception\NavigationNotFoundException;
class Router extends BaseRouter
{
protected $navCache = array();
protected $firstNav;
protected $pageManager;
public function generate($name, $parameters = array(), $referenceType = parent::ABSOLUTE_PATH)
{
if (strpos($name, ':') !== false) {
list($navName, $routeName) = explode(':', $name);
if (isset($this->navCache[$navName])) {
$navId = $this->navCache[$navName]->getId();
} else {
if ($nav = NavQuery::create()->findOneByName($navName)) {
$navId = $nav->getId();
$this->navCache[$navName] = $nav;
}
}
if (!isset($navId)) {
throw new NavigationNotFoundException(sprintf('No navigation found to generate url for route "%s"', $name));
}
$name = sprintf('%d_%s', $navId, $routeName);
$parameters = array_merge(
$parameters,
array(
'_locale' => $this->navCache[$navName]->getCulture(),
)
);
}
try {
return $this->getGenerator()->generate($name, $parameters, $referenceType);
} catch (RouteNotFoundException $e) {
return $this->generateWhenException($e, $name, $parameters, $referenceType);
}
}
protected function generateWhenException(\Exception $e, $name, $parameters = array(), $referenceType = parent::ABSOLUTE_PATH)
{
if (null === $this->firstNav) {
if (!empty($this->navCache)) {
$this->firstNav = $this->navCache[array_keys($this->navCache)[0]]->getId();
} else {
$this->firstNav = NavQuery::create()->findOne();
if ($this->firstNav) {
$this->firstNav = $this->firstNav->getId();
} else {
throw $e;
}
}
}
$name = sprintf('%d_%s', $this->firstNav, $name);
return $this->getGenerator()->generate($name, $parameters, $referenceType);
}
}