1: <?php
2: /**
3: * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
4: * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
5: *
6: * Licensed under The MIT License
7: * For full copyright and license information, please see the LICENSE.txt
8: * Redistributions of files must retain the above copyright notice.
9: *
10: * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
11: * @link https://cakephp.org CakePHP(tm) Project
12: * @since 3.0.0
13: * @license https://opensource.org/licenses/mit-license.php MIT License
14: */
15: namespace Cake\Routing\Route;
16:
17: use Cake\Utility\Inflector;
18:
19: /**
20: * This route class will transparently inflect the controller and plugin routing
21: * parameters, so that requesting `/my_controller` is parsed as `['controller' => 'MyController']`
22: */
23: class InflectedRoute extends Route
24: {
25: /**
26: * Flag for tracking whether or not the defaults have been inflected.
27: *
28: * Default values need to be inflected so that they match the inflections that match()
29: * will create.
30: *
31: * @var bool
32: */
33: protected $_inflectedDefaults = false;
34:
35: /**
36: * Parses a string URL into an array. If it matches, it will convert the prefix, controller and
37: * plugin keys to their camelized form.
38: *
39: * @param string $url The URL to parse
40: * @param string $method The HTTP method being matched.
41: * @return array|false An array of request parameters, or false on failure.
42: */
43: public function parse($url, $method = '')
44: {
45: $params = parent::parse($url, $method);
46: if (!$params) {
47: return false;
48: }
49: if (!empty($params['controller'])) {
50: $params['controller'] = Inflector::camelize($params['controller']);
51: }
52: if (!empty($params['plugin'])) {
53: if (strpos($params['plugin'], '/') === false) {
54: $params['plugin'] = Inflector::camelize($params['plugin']);
55: } else {
56: list($vendor, $plugin) = explode('/', $params['plugin'], 2);
57: $params['plugin'] = Inflector::camelize($vendor) . '/' . Inflector::camelize($plugin);
58: }
59: }
60:
61: return $params;
62: }
63:
64: /**
65: * Underscores the prefix, controller and plugin params before passing them on to the
66: * parent class
67: *
68: * @param array $url Array of parameters to convert to a string.
69: * @param array $context An array of the current request context.
70: * Contains information such as the current host, scheme, port, and base
71: * directory.
72: * @return string|false Either a string URL for the parameters if they match or false.
73: */
74: public function match(array $url, array $context = [])
75: {
76: $url = $this->_underscore($url);
77: if (!$this->_inflectedDefaults) {
78: $this->_inflectedDefaults = true;
79: $this->defaults = $this->_underscore($this->defaults);
80: }
81:
82: return parent::match($url, $context);
83: }
84:
85: /**
86: * Helper method for underscoring keys in a URL array.
87: *
88: * @param array $url An array of URL keys.
89: * @return array
90: */
91: protected function _underscore($url)
92: {
93: if (!empty($url['controller'])) {
94: $url['controller'] = Inflector::underscore($url['controller']);
95: }
96: if (!empty($url['plugin'])) {
97: $url['plugin'] = Inflector::underscore($url['plugin']);
98: }
99:
100: return $url;
101: }
102: }
103: