Blame view
sources/lib/private/appframework/routing/routeconfig.php
5.19 KB
|
31b7f2792
|
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
|
26 |
use OCP\Route\IRouter; |
|
31b7f2792
|
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
|
40 |
* @param \OCP\Route\IRouter $router |
|
31b7f2792
|
41 42 |
* @internal param $appName */ |
|
6d9380f96
|
43 |
public function __construct(DIContainer $container, IRouter $router, $routes) {
|
|
31b7f2792
|
44 45 46 47 48 49 50 |
$this->routes = $routes; $this->container = $container; $this->router = $router; $this->appName = $container['AppName']; } /** |
|
6d9380f96
|
51 |
* The routes and resource will be registered to the \OCP\Route\IRouter |
|
31b7f2792
|
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
|
64 |
* @param array $routes |
|
31b7f2792
|
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
|
87 88 89 |
$router = $this->router->create($this->appName.'.'.$controller.'.'.$action, $url) ->method($verb) ->action($handler); |
|
f7d878ff1
|
90 |
// optionally register requirements for route. This is used to |
|
837968727
|
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
|
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
|
107 |
* @param array $routes |
|
31b7f2792
|
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
|
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
|
130 |
$url = $url . '/{id}';
|
|
31b7f2792
|
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
|
152 |
* @param string $controller |
|
31b7f2792
|
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
|
162 |
* @param string $action |
|
31b7f2792
|
163 164 165 166 167 168 169 |
* @return string
*/
private function buildActionName($action) {
return $this->underScoreToCamelCase($action);
}
/**
|
|
31b7f2792
|
170 |
* Underscored strings are converted to camel case strings |
|
6d9380f96
|
171 |
* @param string $str |
|
31b7f2792
|
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);
}
}
|