Blame view

sources/lib/private/appframework/routing/routeconfig.php 5.19 KB
31b7f2792   Kload   Upgrade to ownclo...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  <?php
  /**
   * ownCloud - App Framework
   *
   * @author Thomas Müller
   * @copyright 2013 Thomas Müller thomas.mueller@tmit.eu
   *
   * This library is free software; you can redistribute it and/or
   * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
   * License as published by the Free Software Foundation; either
   * version 3 of the License, or any later version.
   *
   * This library is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
   *
   * You should have received a copy of the GNU Affero General Public
   * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
   *
   */
  
  namespace OC\AppFramework\routing;
  
  use OC\AppFramework\DependencyInjection\DIContainer;
6d9380f96   Cédric Dupont   Update sources OC...
26
  use OCP\Route\IRouter;
31b7f2792   Kload   Upgrade to ownclo...
27
28
29
30
31
32
33
34
35
36
37
38
39
  
  /**
   * Class RouteConfig
   * @package OC\AppFramework\routing
   */
  class RouteConfig {
  	private $container;
  	private $router;
  	private $routes;
  	private $appName;
  
  	/**
  	 * @param \OC\AppFramework\DependencyInjection\DIContainer $container
6d9380f96   Cédric Dupont   Update sources OC...
40
  	 * @param \OCP\Route\IRouter $router
31b7f2792   Kload   Upgrade to ownclo...
41
42
  	 * @internal param $appName
  	 */
6d9380f96   Cédric Dupont   Update sources OC...
43
  	public function __construct(DIContainer $container, IRouter $router, $routes) {
31b7f2792   Kload   Upgrade to ownclo...
44
45
46
47
48
49
50
  		$this->routes = $routes;
  		$this->container = $container;
  		$this->router = $router;
  		$this->appName = $container['AppName'];
  	}
  
  	/**
6d9380f96   Cédric Dupont   Update sources OC...
51
  	 * The routes and resource will be registered to the \OCP\Route\IRouter
31b7f2792   Kload   Upgrade to ownclo...
52
53
54
55
56
57
58
59
60
61
62
63
  	 */
  	public function register() {
  
  		// parse simple
  		$this->processSimpleRoutes($this->routes);
  
  		// parse resources
  		$this->processResources($this->routes);
  	}
  
  	/**
  	 * Creates one route base on the give configuration
6d9380f96   Cédric Dupont   Update sources OC...
64
  	 * @param array $routes
31b7f2792   Kload   Upgrade to ownclo...
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
  	 * @throws \UnexpectedValueException
  	 */
  	private function processSimpleRoutes($routes)
  	{
  		$simpleRoutes = isset($routes['routes']) ? $routes['routes'] : array();
  		foreach ($simpleRoutes as $simpleRoute) {
  			$name = $simpleRoute['name'];
  			$url = $simpleRoute['url'];
  			$verb = isset($simpleRoute['verb']) ? strtoupper($simpleRoute['verb']) : 'GET';
  
  			$split = explode('#', $name, 2);
  			if (count($split) != 2) {
  				throw new \UnexpectedValueException('Invalid route name');
  			}
  			$controller = $split[0];
  			$action = $split[1];
  
  			$controllerName = $this->buildControllerName($controller);
  			$actionName = $this->buildActionName($action);
  
  			// register the route
  			$handler = new RouteActionHandler($this->container, $controllerName, $actionName);
837968727   Kload   [enh] Upgrade to ...
87
88
89
  			$router = $this->router->create($this->appName.'.'.$controller.'.'.$action, $url)
  							->method($verb)
  							->action($handler);
f7d878ff1   kload   [enh] Update to 7...
90
  			// optionally register requirements for route. This is used to
837968727   Kload   [enh] Upgrade to ...
91
92
93
94
  			// tell the route parser how url parameters should be matched
  			if(array_key_exists('requirements', $simpleRoute)) {
  				$router->requirements($simpleRoute['requirements']);
  			}
31b7f2792   Kload   Upgrade to ownclo...
95
96
97
98
99
100
101
102
103
104
105
106
  		}
  	}
  
  	/**
  	 * For a given name and url restful routes are created:
  	 *  - index
  	 *  - show
  	 *  - new
  	 *  - create
  	 *  - update
  	 *  - destroy
  	 *
6d9380f96   Cédric Dupont   Update sources OC...
107
  	 * @param array $routes
31b7f2792   Kload   Upgrade to ownclo...
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
  	 */
  	private function processResources($routes)
  	{
  		// declaration of all restful actions
  		$actions = array(
  			array('name' => 'index', 'verb' => 'GET', 'on-collection' => true),
  			array('name' => 'show', 'verb' => 'GET'),
  			array('name' => 'create', 'verb' => 'POST', 'on-collection' => true),
  			array('name' => 'update', 'verb' => 'PUT'),
  			array('name' => 'destroy', 'verb' => 'DELETE'),
  		);
  
  		$resources = isset($routes['resources']) ? $routes['resources'] : array();
  		foreach ($resources as $resource => $config) {
  
  			// the url parameter used as id to the resource
31b7f2792   Kload   Upgrade to ownclo...
124
125
126
127
128
129
  			foreach($actions as $action) {
  				$url = $config['url'];
  				$method = $action['name'];
  				$verb = isset($action['verb']) ? strtoupper($action['verb']) : 'GET';
  				$collectionAction = isset($action['on-collection']) ? $action['on-collection'] : false;
  				if (!$collectionAction) {
f7d878ff1   kload   [enh] Update to 7...
130
  					$url = $url . '/{id}';
31b7f2792   Kload   Upgrade to ownclo...
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
  				}
  				if (isset($action['url-postfix'])) {
  					$url = $url . '/' . $action['url-postfix'];
  				}
  
  				$controller = $resource;
  
  				$controllerName = $this->buildControllerName($controller);
  				$actionName = $this->buildActionName($method);
  
  				$routeName = $this->appName . '.' . strtolower($resource) . '.' . strtolower($method);
  
  				$this->router->create($routeName, $url)->method($verb)->action(
  					new RouteActionHandler($this->container, $controllerName, $actionName)
  				);
  			}
  		}
  	}
  
  	/**
  	 * Based on a given route name the controller name is generated
6d9380f96   Cédric Dupont   Update sources OC...
152
  	 * @param string $controller
31b7f2792   Kload   Upgrade to ownclo...
153
154
155
156
157
158
159
160
161
  	 * @return string
  	 */
  	private function buildControllerName($controller)
  	{
  		return $this->underScoreToCamelCase(ucfirst($controller)) . 'Controller';
  	}
  
  	/**
  	 * Based on the action part of the route name the controller method name is generated
6d9380f96   Cédric Dupont   Update sources OC...
162
  	 * @param string $action
31b7f2792   Kload   Upgrade to ownclo...
163
164
165
166
167
168
169
  	 * @return string
  	 */
  	private function buildActionName($action) {
  		return $this->underScoreToCamelCase($action);
  	}
  
  	/**
31b7f2792   Kload   Upgrade to ownclo...
170
  	 * Underscored strings are converted to camel case strings
6d9380f96   Cédric Dupont   Update sources OC...
171
  	 * @param string $str
31b7f2792   Kload   Upgrade to ownclo...
172
173
174
175
176
177
178
179
180
181
182
183
  	 * @return string
  	 */
  	private function underScoreToCamelCase($str) {
  		$pattern = "/_[a-z]?/";
  		return preg_replace_callback(
  			$pattern,
  			function ($matches) {
  				return strtoupper(ltrim($matches[0], "_"));
  			},
  			$str);
  	}
  }