diff options
author | Tom Needham <needham.thomas@gmail.com> | 2012-12-14 15:15:05 +0000 |
---|---|---|
committer | Tom Needham <needham.thomas@gmail.com> | 2012-12-14 15:15:05 +0000 |
commit | 5fe61296981343a3f877618aeecfc33ea7fed3c1 (patch) | |
tree | 919ea533c8d98f71f7c77d534eb0595207d22a17 /lib/router.php | |
parent | 4facd766e3712d4c714f2e1bf2ad4be41461a7cc (diff) | |
parent | f0893fb8fe7f0642ae30de2e1168472377c127e2 (diff) | |
download | nextcloud-server-5fe61296981343a3f877618aeecfc33ea7fed3c1.tar.gz nextcloud-server-5fe61296981343a3f877618aeecfc33ea7fed3c1.zip |
Merge master into ocs_api, fix conflicts.
Diffstat (limited to 'lib/router.php')
-rw-r--r-- | lib/router.php | 125 |
1 files changed, 120 insertions, 5 deletions
diff --git a/lib/router.php b/lib/router.php index 12cd55df414..27e14c38abf 100644 --- a/lib/router.php +++ b/lib/router.php @@ -7,20 +7,58 @@ */ use Symfony\Component\Routing\Matcher\UrlMatcher; +use Symfony\Component\Routing\Generator\UrlGenerator; use Symfony\Component\Routing\RequestContext; use Symfony\Component\Routing\RouteCollection; //use Symfony\Component\Routing\Route; -use Symfony\Component\Routing\Exception\ResourceNotFoundException; class OC_Router { protected $collections = array(); protected $collection = null; protected $root = null; + protected $generator = null; + protected $routing_files; + protected $cache_key; + + public function __construct() { + $baseUrl = OC_Helper::linkTo('', 'index.php'); + $method = $_SERVER['REQUEST_METHOD']; + $host = OC_Request::serverHost(); + $schema = OC_Request::serverProtocol(); + $this->context = new RequestContext($baseUrl, $method, $host, $schema); + // TODO cache + $this->root = $this->getCollection('root'); + } + + public function getRoutingFiles() { + if (!isset($this->routing_files)) { + $this->routing_files = array(); + foreach(OC_APP::getEnabledApps() as $app) { + $file = OC_App::getAppPath($app).'/appinfo/routes.php'; + if(file_exists($file)) { + $this->routing_files[$app] = $file; + } + } + } + return $this->routing_files; + } + + public function getCacheKey() { + if (!isset($this->cache_key)) { + $files = $this->getRoutingFiles(); + $files[] = 'settings/routes.php'; + $files[] = 'core/routes.php'; + $this->cache_key = OC_Cache::generateCacheKeyFromFiles($files); + } + return $this->cache_key; + } + /** * loads the api routes */ public function loadRoutes() { + // TODO cache $this->root = $this->getCollection('root'); foreach(OC_APP::getEnabledApps() as $app){ @@ -36,6 +74,17 @@ class OC_Router { require_once(OC::$SERVERROOT.'/ocs/routes.php'); $collection = $this->getCollection('ocs'); $this->root->addCollection($collection, '/ocs'); + + foreach($this->getRoutingFiles() as $app => $file) { + $this->useCollection($app); + require_once $file; + $collection = $this->getCollection($app); + $this->root->addCollection($collection, '/apps/'.$app); + } + $this->useCollection('root'); + require_once 'settings/routes.php'; + require_once 'core/routes.php'; + } protected function getCollection($name) { @@ -45,19 +94,36 @@ class OC_Router { return $this->collections[$name]; } + /** + * Sets the collection to use for adding routes + * + * @param string $name Name of the colletion to use. + */ public function useCollection($name) { $this->collection = $this->getCollection($name); } + /** + * Create a OC_Route. + * + * @param string $name Name of the route to create. + * @param string $pattern The pattern to match + * @param array $defaults An array of default parameter values + * @param array $requirements An array of requirements for parameters (regexes) + */ public function create($name, $pattern, array $defaults = array(), array $requirements = array()) { $route = new OC_Route($pattern, $defaults, $requirements); $this->collection->add($name, $route); return $route; } - public function match($url) { - $context = new RequestContext($_SERVER['REQUEST_URI'], $_SERVER['REQUEST_METHOD']); - $matcher = new UrlMatcher($this->root, $context); + /** + * Find the route matching $url. + * + * @param string $url The url to find + */ + public function match($url) { + $matcher = new UrlMatcher($this->root, $this->context); $parameters = $matcher->match($url); if (isset($parameters['action'])) { $action = $parameters['action']; @@ -68,9 +134,58 @@ class OC_Router { unset($parameters['action']); call_user_func($action, $parameters); } elseif (isset($parameters['file'])) { - include ($parameters['file']); + include $parameters['file']; } else { throw new Exception('no action available'); } } + + /** + * Get the url generator + * + */ + public function getGenerator() + { + if (null !== $this->generator) { + return $this->generator; + } + + return $this->generator = new UrlGenerator($this->root, $this->context); + } + + /** + * Generate url based on $name and $parameters + * + * @param string $name Name of the route to use. + * @param array $parameters Parameters for the route + */ + public function generate($name, $parameters = array(), $absolute = false) + { + return $this->getGenerator()->generate($name, $parameters, $absolute); + } + + /** + * Generate JSON response for routing in javascript + */ + public static function JSRoutes() + { + $router = OC::getRouter(); + + $etag = $router->getCacheKey(); + OC_Response::enableCaching(); + OC_Response::setETagHeader($etag); + + $root = $router->getCollection('root'); + $routes = array(); + foreach($root->all() as $name => $route) { + $compiled_route = $route->compile(); + $defaults = $route->getDefaults(); + unset($defaults['action']); + $routes[$name] = array( + 'tokens' => $compiled_route->getTokens(), + 'defaults' => $defaults, + ); + } + OCP\JSON::success ( array( 'data' => $routes ) ); + } } |