2015-08-17 17:00:26 -07:00
< ? 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 ;
use Symfony\Component\Config\Resource\ResourceInterface ;
/**
* A RouteCollection represents a set of Route instances .
*
* When adding a route at the end of the collection , an existing route
* with the same name is removed first . So there can only be one route
* with a given name .
*
* @ author Fabien Potencier < fabien @ symfony . com >
* @ author Tobias Schultze < http :// tobion . de >
*/
class RouteCollection implements \IteratorAggregate , \Countable
{
/**
* @ var Route []
*/
private $routes = array ();
/**
* @ var array
*/
private $resources = array ();
public function __clone ()
{
foreach ( $this -> routes as $name => $route ) {
$this -> routes [ $name ] = clone $route ;
}
}
/**
* Gets the current RouteCollection as an Iterator that includes all routes .
*
* It implements \IteratorAggregate .
*
* @ see all ()
*
2017-02-02 16:28:38 -08:00
* @ return \ArrayIterator | Route [] An \ArrayIterator object for iterating over routes
2015-08-17 17:00:26 -07:00
*/
public function getIterator ()
{
return new \ArrayIterator ( $this -> routes );
}
/**
* Gets the number of Routes in this collection .
*
* @ return int The number of routes
*/
public function count ()
{
2018-11-23 12:29:20 +00:00
return \count ( $this -> routes );
2015-08-17 17:00:26 -07:00
}
/**
* Adds a route .
*
* @ param string $name The route name
* @ param Route $route A Route instance
*/
public function add ( $name , Route $route )
{
unset ( $this -> routes [ $name ]);
$this -> routes [ $name ] = $route ;
}
/**
* Returns all routes in this collection .
*
* @ return Route [] An array of routes
*/
public function all ()
{
return $this -> routes ;
}
/**
* 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 )
{
return isset ( $this -> routes [ $name ]) ? $this -> routes [ $name ] : null ;
}
/**
* Removes a route or an array of routes by name from the collection .
*
2018-11-23 12:29:20 +00:00
* @ param string | string [] $name The route name or an array of route names
2015-08-17 17:00:26 -07:00
*/
public function remove ( $name )
{
foreach (( array ) $name as $n ) {
unset ( $this -> routes [ $n ]);
}
}
/**
* Adds a route collection at the end of the current set by appending all
* routes of the added collection .
*/
2018-11-23 12:29:20 +00:00
public function addCollection ( self $collection )
2015-08-17 17:00:26 -07:00
{
// we need to remove all routes with the same names first because just replacing them
// would not place the new route at the end of the merged array
foreach ( $collection -> all () as $name => $route ) {
unset ( $this -> routes [ $name ]);
$this -> routes [ $name ] = $route ;
}
2018-11-23 12:29:20 +00:00
foreach ( $collection -> getResources () as $resource ) {
$this -> addResource ( $resource );
}
2015-08-17 17:00:26 -07:00
}
/**
* 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 ())
{
$prefix = trim ( trim ( $prefix ), '/' );
if ( '' === $prefix ) {
return ;
}
foreach ( $this -> routes as $route ) {
$route -> setPath ( '/' . $prefix . $route -> getPath ());
$route -> addDefaults ( $defaults );
$route -> addRequirements ( $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 ())
{
foreach ( $this -> routes as $route ) {
$route -> setHost ( $pattern );
$route -> addDefaults ( $defaults );
$route -> addRequirements ( $requirements );
}
}
/**
* Sets a condition on all routes .
*
* Existing conditions will be overridden .
*
* @ param string $condition The condition
*/
public function setCondition ( $condition )
{
foreach ( $this -> routes as $route ) {
$route -> setCondition ( $condition );
}
}
/**
* 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 )
{
if ( $defaults ) {
foreach ( $this -> routes as $route ) {
$route -> 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 )
{
if ( $requirements ) {
foreach ( $this -> routes as $route ) {
$route -> 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 )
{
if ( $options ) {
foreach ( $this -> routes as $route ) {
$route -> addOptions ( $options );
}
}
}
/**
* Sets the schemes ( e . g . 'https' ) all child routes are restricted to .
*
2018-11-23 12:29:20 +00:00
* @ param string | string [] $schemes The scheme or an array of schemes
2015-08-17 17:00:26 -07:00
*/
public function setSchemes ( $schemes )
{
foreach ( $this -> routes as $route ) {
$route -> setSchemes ( $schemes );
}
}
/**
* Sets the HTTP methods ( e . g . 'POST' ) all child routes are restricted to .
*
2018-11-23 12:29:20 +00:00
* @ param string | string [] $methods The method or an array of methods
2015-08-17 17:00:26 -07:00
*/
public function setMethods ( $methods )
{
foreach ( $this -> routes as $route ) {
$route -> setMethods ( $methods );
}
}
/**
* Returns an array of resources loaded to build this collection .
*
* @ return ResourceInterface [] An array of resources
*/
public function getResources ()
{
2018-11-23 12:29:20 +00:00
return array_values ( $this -> resources );
2015-08-17 17:00:26 -07:00
}
/**
2018-11-23 12:29:20 +00:00
* Adds a resource for this collection . If the resource already exists
* it is not added .
2015-08-17 17:00:26 -07:00
*/
public function addResource ( ResourceInterface $resource )
{
2018-11-23 12:29:20 +00:00
$key = ( string ) $resource ;
if ( ! isset ( $this -> resources [ $key ])) {
$this -> resources [ $key ] = $resource ;
}
2015-08-17 17:00:26 -07:00
}
}