mirror of
https://github.com/librenms/librenms.git
synced 2024-10-07 16:52:45 +00:00
258 lines
7.7 KiB
PHP
258 lines
7.7 KiB
PHP
<?php
|
|
/**
|
|
* Slim - a micro PHP 5 framework
|
|
*
|
|
* @author Josh Lockhart <info@slimframework.com>
|
|
* @copyright 2011 Josh Lockhart
|
|
* @link http://www.slimframework.com
|
|
* @license http://www.slimframework.com/license
|
|
* @version 2.4.2
|
|
* @package Slim
|
|
*
|
|
* MIT LICENSE
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining
|
|
* a copy of this software and associated documentation files (the
|
|
* "Software"), to deal in the Software without restriction, including
|
|
* without limitation the rights to use, copy, modify, merge, publish,
|
|
* distribute, sublicense, and/or sell copies of the Software, and to
|
|
* permit persons to whom the Software is furnished to do so, subject to
|
|
* the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be
|
|
* included in all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
*/
|
|
namespace Slim;
|
|
|
|
/**
|
|
* Router
|
|
*
|
|
* This class organizes, iterates, and dispatches \Slim\Route objects.
|
|
*
|
|
* @package Slim
|
|
* @author Josh Lockhart
|
|
* @since 1.0.0
|
|
*/
|
|
class Router
|
|
{
|
|
/**
|
|
* @var Route The current route (most recently dispatched)
|
|
*/
|
|
protected $currentRoute;
|
|
|
|
/**
|
|
* @var array Lookup hash of all route objects
|
|
*/
|
|
protected $routes;
|
|
|
|
/**
|
|
* @var array Lookup hash of named route objects, keyed by route name (lazy-loaded)
|
|
*/
|
|
protected $namedRoutes;
|
|
|
|
/**
|
|
* @var array Array of route objects that match the request URI (lazy-loaded)
|
|
*/
|
|
protected $matchedRoutes;
|
|
|
|
/**
|
|
* @var array Array containing all route groups
|
|
*/
|
|
protected $routeGroups;
|
|
|
|
/**
|
|
* Constructor
|
|
*/
|
|
public function __construct()
|
|
{
|
|
$this->routes = array();
|
|
$this->routeGroups = array();
|
|
}
|
|
|
|
/**
|
|
* Get Current Route object or the first matched one if matching has been performed
|
|
* @return \Slim\Route|null
|
|
*/
|
|
public function getCurrentRoute()
|
|
{
|
|
if ($this->currentRoute !== null) {
|
|
return $this->currentRoute;
|
|
}
|
|
|
|
if (is_array($this->matchedRoutes) && count($this->matchedRoutes) > 0) {
|
|
return $this->matchedRoutes[0];
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Return route objects that match the given HTTP method and URI
|
|
* @param string $httpMethod The HTTP method to match against
|
|
* @param string $resourceUri The resource URI to match against
|
|
* @param bool $reload Should matching routes be re-parsed?
|
|
* @return array[\Slim\Route]
|
|
*/
|
|
public function getMatchedRoutes($httpMethod, $resourceUri, $reload = false)
|
|
{
|
|
if ($reload || is_null($this->matchedRoutes)) {
|
|
$this->matchedRoutes = array();
|
|
foreach ($this->routes as $route) {
|
|
if (!$route->supportsHttpMethod($httpMethod) && !$route->supportsHttpMethod("ANY")) {
|
|
continue;
|
|
}
|
|
|
|
if ($route->matches($resourceUri)) {
|
|
$this->matchedRoutes[] = $route;
|
|
}
|
|
}
|
|
}
|
|
|
|
return $this->matchedRoutes;
|
|
}
|
|
|
|
/**
|
|
* Add a route object to the router
|
|
* @param \Slim\Route $route The Slim Route
|
|
*/
|
|
public function map(\Slim\Route $route)
|
|
{
|
|
list($groupPattern, $groupMiddleware) = $this->processGroups();
|
|
|
|
$route->setPattern($groupPattern . $route->getPattern());
|
|
$this->routes[] = $route;
|
|
|
|
|
|
foreach ($groupMiddleware as $middleware) {
|
|
$route->setMiddleware($middleware);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* A helper function for processing the group's pattern and middleware
|
|
* @return array Returns an array with the elements: pattern, middlewareArr
|
|
*/
|
|
protected function processGroups()
|
|
{
|
|
$pattern = "";
|
|
$middleware = array();
|
|
foreach ($this->routeGroups as $group) {
|
|
$k = key($group);
|
|
$pattern .= $k;
|
|
if (is_array($group[$k])) {
|
|
$middleware = array_merge($middleware, $group[$k]);
|
|
}
|
|
}
|
|
return array($pattern, $middleware);
|
|
}
|
|
|
|
/**
|
|
* Add a route group to the array
|
|
* @param string $group The group pattern (ie. "/books/:id")
|
|
* @param array|null $middleware Optional parameter array of middleware
|
|
* @return int The index of the new group
|
|
*/
|
|
public function pushGroup($group, $middleware = array())
|
|
{
|
|
return array_push($this->routeGroups, array($group => $middleware));
|
|
}
|
|
|
|
/**
|
|
* Removes the last route group from the array
|
|
* @return bool True if successful, else False
|
|
*/
|
|
public function popGroup()
|
|
{
|
|
return (array_pop($this->routeGroups) !== null);
|
|
}
|
|
|
|
/**
|
|
* Get URL for named route
|
|
* @param string $name The name of the route
|
|
* @param array $params Associative array of URL parameter names and replacement values
|
|
* @throws \RuntimeException If named route not found
|
|
* @return string The URL for the given route populated with provided replacement values
|
|
*/
|
|
public function urlFor($name, $params = array())
|
|
{
|
|
if (!$this->hasNamedRoute($name)) {
|
|
throw new \RuntimeException('Named route not found for name: ' . $name);
|
|
}
|
|
$search = array();
|
|
foreach ($params as $key => $value) {
|
|
$search[] = '#:' . preg_quote($key, '#') . '\+?(?!\w)#';
|
|
}
|
|
$pattern = preg_replace($search, $params, $this->getNamedRoute($name)->getPattern());
|
|
|
|
//Remove remnants of unpopulated, trailing optional pattern segments, escaped special characters
|
|
return preg_replace('#\(/?:.+\)|\(|\)|\\\\#', '', $pattern);
|
|
}
|
|
|
|
/**
|
|
* Add named route
|
|
* @param string $name The route name
|
|
* @param \Slim\Route $route The route object
|
|
* @throws \RuntimeException If a named route already exists with the same name
|
|
*/
|
|
public function addNamedRoute($name, \Slim\Route $route)
|
|
{
|
|
if ($this->hasNamedRoute($name)) {
|
|
throw new \RuntimeException('Named route already exists with name: ' . $name);
|
|
}
|
|
$this->namedRoutes[(string) $name] = $route;
|
|
}
|
|
|
|
/**
|
|
* Has named route
|
|
* @param string $name The route name
|
|
* @return bool
|
|
*/
|
|
public function hasNamedRoute($name)
|
|
{
|
|
$this->getNamedRoutes();
|
|
|
|
return isset($this->namedRoutes[(string) $name]);
|
|
}
|
|
|
|
/**
|
|
* Get named route
|
|
* @param string $name
|
|
* @return \Slim\Route|null
|
|
*/
|
|
public function getNamedRoute($name)
|
|
{
|
|
$this->getNamedRoutes();
|
|
if ($this->hasNamedRoute($name)) {
|
|
return $this->namedRoutes[(string) $name];
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get named routes
|
|
* @return \ArrayIterator
|
|
*/
|
|
public function getNamedRoutes()
|
|
{
|
|
if (is_null($this->namedRoutes)) {
|
|
$this->namedRoutes = array();
|
|
foreach ($this->routes as $route) {
|
|
if ($route->getName() !== null) {
|
|
$this->addNamedRoute($route->getName(), $route);
|
|
}
|
|
}
|
|
}
|
|
|
|
return new \ArrayIterator($this->namedRoutes);
|
|
}
|
|
}
|