This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
symfony/src/Symfony/Component/Routing/Matcher/Dumper/DumperPrefixCollection.php
2012-12-19 08:09:49 +01:00

109 lines
2.6 KiB
PHP

<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Routing\Matcher\Dumper;
/**
* Prefix tree of routes preserving routes order.
*
* @author Arnaud Le Blanc <arnaud.lb@gmail.com>
*/
class DumperPrefixCollection extends DumperCollection
{
/**
* @var string
*/
private $prefix = '';
/**
* Returns the prefix.
*
* @return string The prefix
*/
public function getPrefix()
{
return $this->prefix;
}
/**
* Sets the prefix.
*
* @param string $prefix The prefix
*/
public function setPrefix($prefix)
{
$this->prefix = $prefix;
}
/**
* Adds a route in the tree.
*
* @param DumperRoute $route The route
*
* @return DumperPrefixCollection The node the route was added to
*
* @throws \LogicException
*/
public function addPrefixRoute(DumperRoute $route)
{
$prefix = $route->getRoute()->compile()->getStaticPrefix();
// Same prefix, add to current leave
if ($this->prefix === $prefix) {
$this->add($route);
return $this;
}
// Prefix starts with route's prefix
if ('' === $this->prefix || 0 === strpos($prefix, $this->prefix)) {
$collection = new DumperPrefixCollection();
$collection->setPrefix(substr($prefix, 0, strlen($this->prefix)+1));
$this->add($collection);
return $collection->addPrefixRoute($route);
}
// No match, fallback to parent (recursively)
if (null === $parent = $this->getParent()) {
throw new \LogicException("The collection root must not have a prefix");
}
return $parent->addPrefixRoute($route);
}
/**
* Merges nodes whose prefix ends with a slash
*
* Children of a node whose prefix ends with a slash are moved to the parent node
*/
public function mergeSlashNodes()
{
$children = array();
foreach ($this as $child) {
if ($child instanceof self) {
$child->mergeSlashNodes();
if ('/' === substr($child->prefix, -1)) {
$children = array_merge($children, $child->all());
} else {
$children[] = $child;
}
} else {
$children[] = $child;
}
}
$this->setAll($children);
}
}