diff --git a/README.md b/README.md index 9471de2..867b602 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Simple PHP router -Simple, fast and yet powerful PHP router that is easy to get integrated and in any project. Heavily inspired by the Laravel router. +Simple, fast and yet powerful PHP router that is easy to get integrated and in any project. Heavily inspired by the way Laravel handles routing. ## Installation -Add the latest version pf Simple PHP Router to your ```composer.json``` +Add the latest version of Simple PHP Router to your ```composer.json``` ```json { @@ -203,7 +203,8 @@ class Router extends SimpleRouter { } ``` -This is a basic example of a helper function for generating urls. +#### Helper functions examples +**This is a basic example of a helper function for generating urls.** ```php use Pecee\SimpleRouter\RouterBase; @@ -212,7 +213,7 @@ function url($controller, $parameters = null, $getParams = null) { } ``` -This is a basic example for getting the current csrf token +**This is a basic example for getting the current csrf token** ```php /** diff --git a/src/Pecee/SimpleRouter/RouterBase.php b/src/Pecee/SimpleRouter/RouterBase.php index 9d04427..fbdd3e8 100644 --- a/src/Pecee/SimpleRouter/RouterBase.php +++ b/src/Pecee/SimpleRouter/RouterBase.php @@ -45,7 +45,6 @@ class RouterBase { protected function processRoutes(array $routes, array $settings = array(), array $prefixes = array(), $backStack = false, $group = null) { // Loop through each route-request - $activeGroup = null; $routesCount = count($routes); $mergedSettings = array(); @@ -54,6 +53,7 @@ class RouterBase { $route = $routes[$i]; + $route->addSettings($settings); $route->setGroup($group); if($this->defaultNamespace && !$route->getNamespace()) { @@ -73,21 +73,20 @@ class RouterBase { array_push($newPrefixes, rtrim($route->getPrefix(), '/')); } - $route->addSettings($settings); - if(!($route instanceof RouterGroup)) { if(is_array($newPrefixes) && count($newPrefixes) && $backStack) { $route->setUrl( join('/', $newPrefixes) . $route->getUrl() ); } + $group = null; $this->controllerUrlMap[] = $route; } $this->currentRoute = $route; if($route instanceof RouterGroup && is_callable($route->getCallback())) { + $group = $route; $route->renderRoute($this->request); - $activeGroup = $route; $mergedSettings = array_merge($route->getMergeableSettings(), $settings); } @@ -98,7 +97,7 @@ class RouterBase { $this->backStack = array(); // Route any routes added to the backstack - $this->processRoutes($backStack, $mergedSettings, $newPrefixes, true, $activeGroup); + $this->processRoutes($backStack, $mergedSettings, $newPrefixes, true, $group); } } } @@ -239,7 +238,20 @@ class RouterBase { protected function processUrl($route, $method = null, $parameters = null, $getParams = null) { - $url = '/' . trim($route->getUrl(), '/'); + $domain = ''; + + if($route->getGroup() !== null && $route->getGroup()->getDomain() !== null) { + if(is_array($route->getGroup()->getDomain())) { + $domains = $route->getGroup()->getDomain(); + $domain = array_shift($domains); + } else { + $domain = $route->getGroup()->getDomain(); + } + + $domain = '//' . $domain; + } + + $url = $domain . '/' . trim($route->getUrl(), '/'); if(($route instanceof RouterController || $route instanceof RouterResource) && $method !== null) { $url .= $method; @@ -251,20 +263,26 @@ class RouterBase { } } else { /* @var $route RouterEntry */ - $params = $route->getParameters(); - if(count($params)) { - $i = 0; - foreach($params as $param => $value) { - $value = (isset($parameters[$param])) ? $parameters[$param] : $value; - $url = str_ireplace(array('{' . $param. '}', '{' . $param. '?}'), $value, $url); - $i++; - } + if(is_array($parameters)) { + $params = array_merge($route->getParameters(), $parameters); } else { - // If no parameters are specified in the route, assume that the provided parameters should be used. - if(count($parameters)) { - $url = rtrim($url, '/') . '/' . join('/', $parameters); - } + $params = $route->getParameters(); } + + $otherParams = []; + + $i = 0; + foreach($params as $param => $value) { + $value = (isset($parameters[$param])) ? $parameters[$param] : $value; + if(stripos($url, '{' . $param. '}') !== false || stripos($url, '{' . $param . '?}') !== false) { + $url = str_ireplace(array('{' . $param . '}', '{' . $param . '?}'), $value, $url); + } else { + $otherParams[$param] = $value; + } + $i++; + } + + $url = rtrim($url, '/') . '/' . join('/', $otherParams); } $url = rtrim($url, '/') . '/'; @@ -287,7 +305,7 @@ class RouterBase { } // Return current route if no options has been specified - if($controller === null && $parameters === null && $this->loadedRoute !== null) { + if($controller === null && $parameters === null) { $getParams = (is_array($getParams)) ? array_merge($_GET, $getParams) : $_GET; $url = parse_url(Request::getInstance()->getUri()); diff --git a/src/Pecee/SimpleRouter/RouterEntry.php b/src/Pecee/SimpleRouter/RouterEntry.php index 67740bd..6e8d8de 100644 --- a/src/Pecee/SimpleRouter/RouterEntry.php +++ b/src/Pecee/SimpleRouter/RouterEntry.php @@ -277,7 +277,7 @@ abstract class RouterEntry { // Check for optional parameter if($lastCharacter === '?') { $parameter = substr($parameter, 0, strlen($parameter)-1); - $regex .= '(?:(?:\/{0,1}(?P<'.$parameter.'>'.$parameterRegex.')){0,1}\\/{0,1})'; + $regex .= '(?:(?:\/{0,1}(?P<'.$parameter.'>[^\/]*)))\\/{0,1}'; $required = false; } else { $regex .= '(?:\\/{0,1}(?P<' . $parameter . '>'. $parameterRegex .')\\/{0,1})'; diff --git a/src/Pecee/SimpleRouter/RouterGroup.php b/src/Pecee/SimpleRouter/RouterGroup.php index 71de05d..e9fa128 100644 --- a/src/Pecee/SimpleRouter/RouterGroup.php +++ b/src/Pecee/SimpleRouter/RouterGroup.php @@ -60,9 +60,7 @@ class RouterGroup extends RouterEntry { throw new RouterException('Method not allowed'); } - if($this->matchDomain($request) === null) { - return null; - } + $this->matchDomain($request); return parent::renderRoute($request); } @@ -80,4 +78,8 @@ class RouterGroup extends RouterEntry { return $this->exceptionHandler; } + public function getDomain() { + return $this->domain; + } + } \ No newline at end of file diff --git a/src/Pecee/SimpleRouter/RouterResource.php b/src/Pecee/SimpleRouter/RouterResource.php index de70b17..0dff961 100644 --- a/src/Pecee/SimpleRouter/RouterResource.php +++ b/src/Pecee/SimpleRouter/RouterResource.php @@ -5,11 +5,8 @@ use Pecee\Http\Request; class RouterResource extends RouterEntry { - const DEFAULT_METHOD = 'index'; - protected $url; protected $controller; - protected $method; protected $postMethod; public function __construct($url, $controller) { @@ -52,55 +49,51 @@ class RouterResource extends RouterEntry { $url = parse_url($request->getUri()); $url = rtrim($url['path'], '/') . '/'; - if(strtolower($url) == strtolower($this->url) || stripos($url, $this->url) === 0) { - $url = rtrim($url, '/'); + $route = rtrim($this->url, '/') . '/{id?}/{action?}'; - $strippedUrl = trim(substr($url, strlen($this->url)), '/'); - $path = explode('/', $strippedUrl); + $parameters = $this->parseParameters($route, $url, '[0-9]*?'); - $args = $path; - $action = ''; + if($parameters !== null) { - if(count($args)) { - $action = $args[0]; - array_shift($args); + if(is_array($parameters)) { + $parameters = array_merge($this->parameters, $parameters); } - if (count($path)) { + $action = $parameters['action']; + unset($parameters['action']); - // Delete - if($request->getMethod() === self::REQUEST_TYPE_DELETE && $this->postMethod === self::REQUEST_TYPE_POST) { - return $this->call('destroy', $args); - } - - // Update - if(in_array($request->getMethod(), array('put', 'patch')) && $this->postMethod === self::REQUEST_TYPE_POST) { - return $this->call('update', array_merge(array($action), $args)); - } - - // Edit - if(isset($args[0]) && strtolower($args[0]) === 'edit' && $this->postMethod === self::REQUEST_TYPE_GET) { - return $this->call('edit', array_merge(array($action), array_slice($args, 1))); - } - - // Create - if(strtolower($action) === 'create' && $request->getMethod() === self::REQUEST_TYPE_GET) { - return $this->call('create', $args); - } - - // Save - if($this->postMethod === self::REQUEST_TYPE_POST) { - return $this->call('store', $args); - } - - // Show - if($action && $this->postMethod === self::REQUEST_TYPE_GET) { - return $this->call('show', array_merge(array($action), $args)); - } - - // Index - return $this->call('index', $args); + // Delete + if($request->getMethod() === self::REQUEST_TYPE_DELETE && $this->postMethod === self::REQUEST_TYPE_POST) { + return $this->call('destroy', $parameters); } + + // Update + if(in_array($request->getMethod(), array(self::REQUEST_TYPE_PATCH, self::REQUEST_TYPE_PUT)) && $this->postMethod === self::REQUEST_TYPE_POST) { + return $this->call('update', $parameters); + } + + // Edit + if(isset($action) && strtolower($action) === 'edit' && $this->postMethod === self::REQUEST_TYPE_GET) { + return $this->call('edit', $parameters); + } + + // Create + if(strtolower($action) === 'create' && $request->getMethod() === self::REQUEST_TYPE_GET) { + return $this->call('create', $parameters); + } + + // Save + if($this->postMethod === self::REQUEST_TYPE_POST) { + return $this->call('store', $parameters); + } + + // Show + if($action && $this->postMethod === self::REQUEST_TYPE_GET) { + return $this->call('show', $parameters); + } + + // Index + return $this->call('index', $parameters); } return null; @@ -135,18 +128,4 @@ class RouterResource extends RouterEntry { $this->controller = $controller; } - /** - * @return string - */ - public function getMethod() { - return $this->method; - } - - /** - * @param string $method - */ - public function setMethod($method) { - $this->method = $method; - } - } \ No newline at end of file