2021-07-27 14:46:32 +02: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 = [];
/**
* @ var array
*/
private $resources = [];
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 ()
*
* @ return \ArrayIterator | Route [] An \ArrayIterator object for iterating over routes
*/
2022-05-03 15:24:29 +02:00
#[\ReturnTypeWillChange]
2021-07-27 14:46:32 +02:00
public function getIterator ()
{
return new \ArrayIterator ( $this -> routes );
}
/**
* Gets the number of Routes in this collection .
*
* @ return int The number of routes
*/
2022-05-03 15:24:29 +02:00
#[\ReturnTypeWillChange]
2021-07-27 14:46:32 +02:00
public function count ()
{
return \count ( $this -> routes );
}
/**
* Adds a route .
*
* @ param string $name The route name
*/
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 $this -> routes [ $name ] ? ? null ;
}
/**
* Removes a route or an array of routes by name from the collection .
*
* @ param string | string [] $name The route name or an array of route names
*/
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 .
*/
public function addCollection ( self $collection )
{
// 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 ;
}
foreach ( $collection -> getResources () as $resource ) {
$this -> addResource ( $resource );
}
}
/**
* 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 $requirements = [])
{
if ( null === $prefix ) {
@ trigger_error ( sprintf ( 'Passing null as $prefix to %s is deprecated in Symfony 4.4 and will trigger a TypeError in 5.0.' , __METHOD__ ), \E_USER_DEPRECATED );
}
$prefix = trim ( trim ( $prefix ), '/' );
if ( '' === $prefix ) {
return ;
}
foreach ( $this -> routes as $route ) {
$route -> setPath ( '/' . $prefix . $route -> getPath ());
$route -> addDefaults ( $defaults );
$route -> addRequirements ( $requirements );
}
}
/**
* Adds a prefix to the name of all the routes within in the collection .
*/
public function addNamePrefix ( string $prefix )
{
$prefixedRoutes = [];
foreach ( $this -> routes as $name => $route ) {
$prefixedRoutes [ $prefix . $name ] = $route ;
if ( null !== $name = $route -> getDefault ( '_canonical_route' )) {
$route -> setDefault ( '_canonical_route' , $prefix . $name );
}
}
$this -> routes = $prefixedRoutes ;
}
/**
* 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 $requirements = [])
{
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 .
*/
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 .
*
* @ param string | string [] $schemes The scheme or an array of schemes
*/
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 .
*
* @ param string | string [] $methods The method or an array of methods
*/
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 ()
{
return array_values ( $this -> resources );
}
/**
* Adds a resource for this collection . If the resource already exists
* it is not added .
*/
public function addResource ( ResourceInterface $resource )
{
$key = ( string ) $resource ;
if ( ! isset ( $this -> resources [ $key ])) {
$this -> resources [ $key ] = $resource ;
}
}
}