123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- <?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>
- *
- * @internal
- */
- 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 self
- *
- * @throws \LogicException
- */
- public function addPrefixRoute(DumperRoute $route)
- {
- $prefix = $route->getRoute()->compile()->getStaticPrefix();
- for ($collection = $this; null !== $collection; $collection = $collection->getParent()) {
- // Same prefix, add to current leave
- if ($collection->prefix === $prefix) {
- $collection->add($route);
- return $collection;
- }
- // Prefix starts with route's prefix
- if ('' === $collection->prefix || 0 === strpos($prefix, $collection->prefix)) {
- $child = new self();
- $child->setPrefix(substr($prefix, 0, strlen($collection->prefix) + 1));
- $collection->add($child);
- return $child->addPrefixRoute($route);
- }
- }
- // Reached only if the root has a non empty prefix
- throw new \LogicException('The collection root must not have a prefix');
- }
- /**
- * 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);
- }
- }
|