2015-08-17 17:00:26 -07:00
< ? php
/*
* This file is part of the Symfony CMF package .
*
2016-10-06 15:16:20 -07:00
* ( c ) 2011 - 2015 Symfony CMF
2015-08-17 17:00:26 -07:00
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Cmf\Component\Routing ;
use Symfony\Component\Config\Resource\ResourceInterface ;
use Symfony\Component\Routing\Route ;
use Symfony\Component\Routing\RouteCollection ;
class ChainRouteCollection extends RouteCollection
{
/**
* @ var RouteCollection []
*/
private $routeCollections = array ();
/**
* @ var RouteCollection
*/
private $routeCollection ;
public function __clone ()
{
foreach ( $this -> routeCollections as $routeCollection ) {
$this -> routeCollections [] = clone $routeCollection ;
}
}
/**
* Gets the current RouteCollection as an Iterator that includes all routes .
*
* It implements \IteratorAggregate .
*
* @ see all ()
*
* @ return \ArrayIterator An \ArrayIterator object for iterating over routes
*/
public function getIterator ()
{
return new \ArrayIterator ( $this -> all ());
}
/**
* Gets the number of Routes in this collection .
*
* @ return int The number of routes
*/
public function count ()
{
$count = 0 ;
foreach ( $this -> routeCollections as $routeCollection ) {
2016-10-06 15:16:20 -07:00
$count += $routeCollection -> count ();
2015-08-17 17:00:26 -07:00
}
return $count ;
}
/**
* Adds a route .
*
* @ param string $name The route name
* @ param Route $route A Route instance
*/
public function add ( $name , Route $route )
{
$this -> createInternalCollection ();
$this -> routeCollection -> add ( $name , $route );
}
/**
* Returns all routes in this collection .
*
* @ return Route [] An array of routes
*/
public function all ()
{
$routeCollectionAll = new RouteCollection ();
foreach ( $this -> routeCollections as $routeCollection ) {
$routeCollectionAll -> addCollection ( $routeCollection );
}
return $routeCollectionAll -> all ();
}
/**
* Gets a route by name .
*
* @ param string $name The route name
*
* @ return Route | null A Route instance or null when not found
*/
public function get ( $name )
{
foreach ( $this -> routeCollections as $routeCollection ) {
$route = $routeCollection -> get ( $name );
if ( null !== $route ) {
return $route ;
}
}
2016-10-06 15:16:20 -07:00
return ;
2015-08-17 17:00:26 -07:00
}
/**
2016-10-06 15:16:20 -07:00
* Removes a route or an array of routes by name from the collection .
2015-08-17 17:00:26 -07:00
*
* @ param string | array $name The route name or an array of route names
*/
public function remove ( $name )
{
foreach ( $this -> routeCollections as $routeCollection ) {
$route = $routeCollection -> get ( $name );
if ( null !== $route ) {
$routeCollection -> remove ( $name );
}
}
}
/**
* Adds a route collection at the end of the current set by appending all
* routes of the added collection .
*
* @ param RouteCollection $collection A RouteCollection instance
*/
public function addCollection ( RouteCollection $collection )
{
$this -> routeCollections [] = $collection ;
}
/**
* Adds a prefix to the path of all child routes .
*
* @ param string $prefix An optional prefix to add before each pattern of the route collection
* @ param array $defaults An array of default values
* @ param array $requirements An array of requirements
*/
public function addPrefix ( $prefix , array $defaults = array (), array $requirements = array ())
{
$this -> createInternalCollection ();
foreach ( $this -> routeCollections as $routeCollection ) {
$routeCollection -> addPrefix ( $prefix , $defaults , $requirements );
}
}
/**
* Sets the host pattern on all routes .
*
* @ param string $pattern The pattern
* @ param array $defaults An array of default values
* @ param array $requirements An array of requirements
*/
public function setHost ( $pattern , array $defaults = array (), array $requirements = array ())
{
$this -> createInternalCollection ();
foreach ( $this -> routeCollections as $routeCollection ) {
$routeCollection -> setHost ( $pattern , $defaults , $requirements );
}
}
/**
* Adds defaults to all routes .
*
* An existing default value under the same name in a route will be overridden .
*
* @ param array $defaults An array of default values
*/
public function addDefaults ( array $defaults )
{
$this -> createInternalCollection ();
foreach ( $this -> routeCollections as $routeCollection ) {
$routeCollection -> addDefaults ( $defaults );
}
}
/**
* Adds requirements to all routes .
*
* An existing requirement under the same name in a route will be overridden .
*
* @ param array $requirements An array of requirements
*/
public function addRequirements ( array $requirements )
{
$this -> createInternalCollection ();
foreach ( $this -> routeCollections as $routeCollection ) {
$routeCollection -> addRequirements ( $requirements );
}
}
/**
* Adds options to all routes .
*
* An existing option value under the same name in a route will be overridden .
*
* @ param array $options An array of options
*/
public function addOptions ( array $options )
{
$this -> createInternalCollection ();
foreach ( $this -> routeCollections as $routeCollection ) {
$routeCollection -> addOptions ( $options );
}
}
/**
* Sets the schemes ( e . g . 'https' ) all child routes are restricted to .
*
* @ param string | array $schemes The scheme or an array of schemes
*/
public function setSchemes ( $schemes )
{
$this -> createInternalCollection ();
foreach ( $this -> routeCollections as $routeCollection ) {
$routeCollection -> setSchemes ( $schemes );
}
}
/**
* Sets the HTTP methods ( e . g . 'POST' ) all child routes are restricted to .
*
* @ param string | array $methods The method or an array of methods
*/
public function setMethods ( $methods )
{
$this -> createInternalCollection ();
foreach ( $this -> routeCollections as $routeCollection ) {
$routeCollection -> setMethods ( $methods );
}
}
/**
* Returns an array of resources loaded to build this collection .
*
* @ return ResourceInterface [] An array of resources
*/
public function getResources ()
{
$resources = array ();
foreach ( $this -> routeCollections as $routeCollection ) {
$resources = array_merge ( $resources , $routeCollection -> getResources ());
}
return array_unique ( $resources );
}
/**
* Adds a resource for this collection .
*
* @ param ResourceInterface $resource A resource instance
*/
public function addResource ( ResourceInterface $resource )
{
$this -> createInternalCollection ();
$this -> routeCollection -> addResource ( $resource );
}
private function createInternalCollection ()
{
if ( ! $this -> routeCollection instanceof RouteCollection ) {
$this -> routeCollection = new RouteCollection ();
$this -> routeCollections [] = $this -> routeCollection ;
}
}
}