diff --git a/src/Symfony/Component/Routing/Route.php b/src/Symfony/Component/Routing/Route.php index 775be741d3..bbd882f09d 100644 --- a/src/Symfony/Component/Routing/Route.php +++ b/src/Symfony/Component/Routing/Route.php @@ -25,6 +25,7 @@ class Route implements \Serializable private $requirements; private $options; private $compiled; + private $hostnamePattern; private static $compilers = array(); @@ -39,15 +40,17 @@ class Route implements \Serializable * @param array $defaults An array of default parameter values * @param array $requirements An array of requirements for parameters (regexes) * @param array $options An array of options + * @param string $hostname The hostname pattern to match * * @api */ - public function __construct($pattern, array $defaults = array(), array $requirements = array(), array $options = array()) + public function __construct($pattern, array $defaults = array(), array $requirements = array(), array $options = array(), $hostnamePattern = null) { $this->setPattern($pattern); $this->setDefaults($defaults); $this->setRequirements($requirements); $this->setOptions($options); + $this->setHostnamePattern($hostnamePattern); } public function __clone() @@ -103,6 +106,18 @@ class Route implements \Serializable return $this; } + public function getHostnamePattern() + { + return $this->hostnamePattern; + } + + public function setHostnamePattern($pattern) + { + $this->hostnamePattern = $pattern; + + return $this; + } + /** * Returns the options. * diff --git a/src/Symfony/Component/Routing/RouteCollection.php b/src/Symfony/Component/Routing/RouteCollection.php index 17be00e51e..bae7b4dd6f 100644 --- a/src/Symfony/Component/Routing/RouteCollection.php +++ b/src/Symfony/Component/Routing/RouteCollection.php @@ -30,6 +30,7 @@ class RouteCollection implements \IteratorAggregate, \Countable private $resources; private $prefix; private $parent; + private $hostnamePattern; /** * Constructor. @@ -41,6 +42,7 @@ class RouteCollection implements \IteratorAggregate, \Countable $this->routes = array(); $this->resources = array(); $this->prefix = ''; + $this->hostnamePattern = null; } public function __clone() @@ -188,12 +190,13 @@ class RouteCollection implements \IteratorAggregate, \Countable * @param array $defaults An array of default values * @param array $requirements An array of requirements * @param array $options An array of options + * @param string $hostnamePattern Hostname pattern * * @throws \InvalidArgumentException When the RouteCollection already exists in the tree * * @api */ - public function addCollection(RouteCollection $collection, $prefix = '', $defaults = array(), $requirements = array(), $options = array()) + public function addCollection(RouteCollection $collection, $prefix = '', $defaults = array(), $requirements = array(), $options = array(), $hostnamePattern = null) { // prevent infinite loops by recursive referencing $root = $this->getRoot(); @@ -208,6 +211,12 @@ class RouteCollection implements \IteratorAggregate, \Countable // the sub-collection must have the prefix of the parent (current instance) prepended because it does not // necessarily already have it applied (depending on the order RouteCollections are added to each other) $collection->addPrefix($this->getPrefix() . $prefix, $defaults, $requirements, $options); + + // Allow child collection to have a different pattern + if (!$collection->getHostnamePattern()) { + $collection->setHostnamePattern($hostnamePattern); + } + $this->routes[] = $collection; } @@ -341,4 +350,22 @@ class RouteCollection implements \IteratorAggregate, \Countable return false; } + + public function getHostnamePattern() + { + return $this->hostnamePattern; + } + + public function setHostnamePattern($pattern) + { + $this->hostnamePattern = $pattern; + + foreach ($this->routes as $name => $route) { + // Allow individual routes to have a different pattern + if (!$route->getHostnamePattern()) { + $route->setHostnamePattern($pattern); + } + } + } + }