|
|
@@ -16,8 +16,8 @@ namespace Cake\Routing;
|
|
|
|
|
|
use BadMethodCallException;
|
|
|
use Cake\Core\App;
|
|
|
-use Cake\Routing\Route\Route;
|
|
|
use Cake\Routing\Router;
|
|
|
+use Cake\Routing\Route\Route;
|
|
|
use Cake\Utility\Inflector;
|
|
|
use InvalidArgumentException;
|
|
|
|
|
|
@@ -57,11 +57,18 @@ class RouteBuilder {
|
|
|
];
|
|
|
|
|
|
/**
|
|
|
+ * Default route class to use if none is provided in connect() options.
|
|
|
+ *
|
|
|
+ * @var string
|
|
|
+ */
|
|
|
+ protected $_routeClass = 'Cake\Routing\Route\Route';
|
|
|
+
|
|
|
+/**
|
|
|
* The extensions that should be set into the routes connected.
|
|
|
*
|
|
|
* @var array
|
|
|
*/
|
|
|
- protected $_extensions;
|
|
|
+ protected $_extensions = [];
|
|
|
|
|
|
/**
|
|
|
* The path prefix scope that this collection uses.
|
|
|
@@ -90,13 +97,34 @@ class RouteBuilder {
|
|
|
* @param \Cake\Routing\RouteCollection $collection The route collection to append routes into.
|
|
|
* @param string $path The path prefix the scope is for.
|
|
|
* @param array $params The scope's routing parameters.
|
|
|
- * @param array $extensions The extensions to connect when adding routes.
|
|
|
+ * @param array $options Options list. Valid keys are:
|
|
|
+ *
|
|
|
+ * - `routeClass` - The default route class to use when adding routes.
|
|
|
+ * - `extensions` - The extensions to connect when adding routes.
|
|
|
*/
|
|
|
- public function __construct($collection, $path, array $params = [], array $extensions = []) {
|
|
|
+ public function __construct($collection, $path, array $params = [], array $options = []) {
|
|
|
$this->_collection = $collection;
|
|
|
$this->_path = $path;
|
|
|
$this->_params = $params;
|
|
|
- $this->_extensions = $extensions;
|
|
|
+ if (isset($options['routeClass'])) {
|
|
|
+ $this->_routeClass = $options['routeClass'];
|
|
|
+ }
|
|
|
+ if (isset($options['extensions'])) {
|
|
|
+ $this->_extensions = $options['extensions'];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+/**
|
|
|
+ * Get or set default route class.
|
|
|
+ *
|
|
|
+ * @param string|null $routeClass Class name.
|
|
|
+ * @return string|void
|
|
|
+ */
|
|
|
+ public function routeClass($routeClass = null) {
|
|
|
+ if ($routeClass == null) {
|
|
|
+ return $this->_routeClass;
|
|
|
+ }
|
|
|
+ $this->_routeClass = $routeClass;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -323,6 +351,10 @@ class RouteBuilder {
|
|
|
$options['_ext'] = $this->_extensions;
|
|
|
}
|
|
|
|
|
|
+ if (empty($options['routeClass'])) {
|
|
|
+ $options['routeClass'] = $this->_routeClass;
|
|
|
+ }
|
|
|
+
|
|
|
$route = $this->_makeRoute($route, $defaults, $options);
|
|
|
$this->_collection->add($route, $options);
|
|
|
}
|
|
|
@@ -339,14 +371,13 @@ class RouteBuilder {
|
|
|
*/
|
|
|
protected function _makeRoute($route, $defaults, $options) {
|
|
|
if (is_string($route)) {
|
|
|
- $routeClass = 'Cake\Routing\Route\Route';
|
|
|
- if (isset($options['routeClass'])) {
|
|
|
- $routeClass = App::className($options['routeClass'], 'Routing/Route');
|
|
|
- }
|
|
|
+ $routeClass = App::className($options['routeClass'], 'Routing/Route');
|
|
|
if ($routeClass === false) {
|
|
|
- throw new InvalidArgumentException(sprintf('Cannot find route class %s', $options['routeClass']));
|
|
|
+ throw new InvalidArgumentException(sprintf(
|
|
|
+ 'Cannot find route class %s',
|
|
|
+ $options['routeClass']
|
|
|
+ ));
|
|
|
}
|
|
|
- unset($options['routeClass']);
|
|
|
|
|
|
$route = str_replace('//', '/', $this->_path . $route);
|
|
|
$route = $route === '/' ? $route : rtrim($route, '/');
|
|
|
@@ -503,7 +534,10 @@ class RouteBuilder {
|
|
|
$path = $this->_path . $path;
|
|
|
}
|
|
|
$params = $params + $this->_params;
|
|
|
- $builder = new static($this->_collection, $path, $params, $this->_extensions);
|
|
|
+ $builder = new static($this->_collection, $path, $params, [
|
|
|
+ 'routeClass' => $this->_routeClass,
|
|
|
+ 'extensions' => $this->_extensions
|
|
|
+ ]);
|
|
|
$callback($builder);
|
|
|
}
|
|
|
|
|
|
@@ -515,8 +549,12 @@ class RouteBuilder {
|
|
|
* @return void
|
|
|
*/
|
|
|
public function fallbacks() {
|
|
|
- $this->connect('/:controller', ['action' => 'index'], ['routeClass' => 'InflectedRoute']);
|
|
|
- $this->connect('/:controller/:action/*', [], ['routeClass' => 'InflectedRoute']);
|
|
|
+ $routeClass = $this->_routeClass;
|
|
|
+ if ($routeClass === 'Cake\Routing\Route\Route') {
|
|
|
+ $routeClass = 'InflectedRoute';
|
|
|
+ }
|
|
|
+ $this->connect('/:controller', ['action' => 'index'], compact('routeClass'));
|
|
|
+ $this->connect('/:controller/:action/*', [], compact('routeClass'));
|
|
|
}
|
|
|
|
|
|
}
|