Compare commits

...

28 Commits

Author SHA1 Message Date
Simon Sessingø 358b25d4f1 Merge pull request #73 from skipperbent/development
Development
2016-03-18 17:55:31 +01:00
Simon Sessingø 5483ffe458 [TASK] Readded group match inheritence .
- Settings on routes now have higher priority when merging settings from
  group.
2016-03-18 17:43:57 +01:00
Simon Sessingø 6d8e95fcaa [TASK] Match on group are no longer merged to child routes. 2016-03-18 15:21:45 +01:00
Simon Sessingø 3d45851d9b Merge pull request #72 from skipperbent/development
[BUGFIX] Only render group if prefix matches.
2016-03-16 19:58:03 +01:00
Simon Sessingø db78135d19 [BUGFIX] Only render group if prefix matches. 2016-03-16 19:57:54 +01:00
Simon Sessingø c4fcf750d4 Added support for x-forwarded-proto http header 2016-03-14 01:09:35 +01:00
Simon Sessingø ee5c2207f8 Merge pull request #71 from skipperbent/development
Added support for x-forwarded-proto http header
2016-03-14 01:08:25 +01:00
Simon Sessingø a92b6008fa [TASK] Added http code to redirect method. 2016-03-14 01:00:19 +01:00
Simon Sessingø b1ca3fc9ef Merge pull request #70 from skipperbent/development
[FEATURE] Added http code to redirect method.
2016-03-14 00:59:09 +01:00
Simon Sessingø 253c0c70d4 Merge pull request #69 from skipperbent/development
[BUGFIX] Bugfix
2016-03-01 22:52:38 +01:00
Simon Sessingø 115c8e510a [BUGFIX] Added urldecode to RouterRessource, RouterRoute and
RouterController class to ensure that urls with special letters can be
picked up by a custom regular expression (read documentation: match).
2016-03-01 22:50:26 +01:00
Simon Sessingø 53ba2d7ac5 Merge pull request #68 from skipperbent/development
[TASK] Fixed regex causing optional parameters to sometimes catch req…
2016-01-23 16:12:27 +01:00
Simon Sessingø 35ee79d02c [TASK] Fixed regex causing optional parameters to sometimes catch required
parameters value.
2016-01-23 16:10:44 +01:00
Simon Sessingø 315fe05769 Merge pull request #67 from skipperbent/development
Development
2016-01-17 04:57:39 +01:00
Simon Sessingø 6306b604e8 Merge branch 'development' of https://github.com/skipperbent/simple-php-router into development 2016-01-17 04:56:56 +01:00
Simon Sessingø 4dd0739df9 [BUGFIX] Fixed minor errors with optional parameter when using getRoute(). 2016-01-17 04:56:29 +01:00
Simon Sessingø a57113309a Merge pull request #66 from skipperbent/development
Development
2016-01-15 11:56:04 +01:00
Simon Sessingø 0bd234d996 Merge pull request #65 from skipperbent/master
Latest development
2016-01-15 11:55:47 +01:00
Simon Sessingø 27d24758b1 [OPTIMISATION] Ensured action parameter was set before using it. 2016-01-15 11:55:01 +01:00
Simon Sessingø 4d08f08c68 Merge pull request #64 from skipperbent/development
Development
2016-01-15 11:09:00 +01:00
Simon Sessingø aeacda1812 [FEATURE] Added option to change route and get information about current
route through the Request object.

- Updated documentation to relfect new changes.
2016-01-15 11:06:13 +01:00
Simon Sessingø 765204f552 [FEATURE] Moved loadedRoute to request so it can be easily overwritten
from middleware.
2016-01-15 10:34:59 +01:00
Simon Sessingø 4267cb8751 Merge pull request #63 from skipperbent/development
[OPTIMISATION] Parameters matching optimisations.
2016-01-15 10:22:14 +01:00
Simon Sessingø 714edf7902 [OPTIMISATION] Parameters matching optimisations. 2016-01-15 10:20:50 +01:00
Simon Sessingø c3b12ba053 Merge pull request #62 from skipperbent/development
Development
2016-01-15 10:07:51 +01:00
Simon Sessingø b096742d6b [BUGFIX] Enchanched regular expression for optinal parameters to
completely ignore path seperators (/).
2016-01-15 10:06:13 +01:00
Simon Sessingø 3298970798 Merge pull request #61 from skipperbent/development
[BUGFIX] Fixed some ressources not working after latest update.
2016-01-15 09:39:28 +01:00
Simon Sessingø bb6f56ef8c [BUGFIX] Fixed some ressources not working after latest update.
- Optimisations + cleanup.
2016-01-15 09:37:23 +01:00
9 changed files with 97 additions and 34 deletions
+21
View File
@@ -270,6 +270,24 @@ Register the new class in your ```routes.php```, custom ```Router``` class or wh
SimpleRouter::csrfVerifier(new \Demo\Middleware\CsrfVerifier());
```
## Easily overwrite route about to be loaded
Sometimes it can be useful to manipulate the route that's about to be loaded, for instance if a user is not authenticated or if an error occurred within your Middleware that requires
some other route to be initialised. Simple PHP Router allows you to easily change the route about to be executed. All information about the current route is stored in
the ```\Pecee\SimpleRouter\Http\Request``` object.
**Note:** Please note that it's only possible to change the route BEFORE any route has initially been loaded, so doing this in your custom ExceptionHandler or Middleware is highly recommended.
```php
$route = Request::getInstance()->getLoadedRoute();
$route->setCallback('Example\MyCustomClass@hello');
// -- or --
$route->setClass('Example\MyCustomClass');
$route->setMethod('hello');
```
## Documentation
While I work on a better documentation, please refer to the Laravel 5 routing documentation here:
@@ -278,6 +296,9 @@ http://laravel.com/docs/5.1/routing
## Easily extendable
The router can be easily extended to customize your needs.
## Ideas and issues
If you want a great new feature or experience any issues what-so-ever, please feel free to leave an issue and i'll look into it whenever possible.
## The MIT License (MIT)
Copyright (c) 2015 Simon Sessingø / simple-php-router
+26
View File
@@ -1,6 +1,8 @@
<?php
namespace Pecee\Http;
use Pecee\SimpleRouter\RouterBase;
class Request {
protected static $instance;
@@ -10,6 +12,7 @@ class Request {
protected $host;
protected $method;
protected $headers;
protected $loadedRoute;
/**
* Return new instance
@@ -41,6 +44,9 @@ class Request {
}
public function getIsSecure() {
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https') {
return true;
}
return isset($_SERVER['HTTPS']) ? true : (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] === 443);
}
@@ -140,4 +146,24 @@ class Request {
return isset($this->data[$name]) ? $this->data[$name] : null;
}
/**
* Get the currently loaded route.
* @return \Pecee\SimpleRouter\RouterEntry
*/
public function getLoadedRoute() {
return $this->loadedRoute;
}
public function isFormatAccepted($format) {
return (isset($_SERVER['HTTP_ACCEPT']) && stripos($_SERVER['HTTP_ACCEPT'], $format) > -1);
}
public function getAcceptFormats() {
if(isset($_SERVER['HTTP_ACCEPT'])) {
return explode(',', $_SERVER['HTTP_ACCEPT']);
}
return array();
}
}
+6 -1
View File
@@ -19,8 +19,13 @@ class Response {
* Redirect the response
*
* @param string $url
* @param int $httpCode
*/
public function redirect($url) {
public function redirect($url, $httpCode = null) {
if($httpCode !== null) {
$this->httpCode($httpCode);
}
$this->header('Location: ' . $url);
die();
}
+9 -15
View File
@@ -15,7 +15,6 @@ class RouterBase {
protected $processedRoutes;
protected $controllerUrlMap;
protected $backStack;
protected $loadedRoute;
protected $defaultNamespace;
protected $baseCsrfVerifier;
@@ -87,7 +86,7 @@ class RouterBase {
$this->currentRoute = $route;
if($route instanceof RouterGroup && is_callable($route->getCallback())) {
if($route instanceof RouterGroup && $route->matchRoute($this->request) && is_callable($route->getCallback())) {
$group = $route;
$route->renderRoute($this->request);
$mergedSettings = array_merge($route->getMergeableSettings(), $settings);
@@ -127,12 +126,6 @@ class RouterBase {
$route = $this->controllerUrlMap[$i];
if($route->getGroup() !== null) {
if($route->getGroup()->matchDomain($this->request) === false) {
continue;
}
}
$routeMatch = $route->matchRoute($this->request);
if($routeMatch) {
@@ -144,9 +137,10 @@ class RouterBase {
$routeNotAllowed = false;
$this->loadedRoute = $route;
$this->request->loadedRoute = $route;
$route->loadMiddleware($this->request);
$route->renderRoute($this->request);
$this->request->loadedRoute->renderRoute($this->request);
break;
}
}
@@ -155,7 +149,7 @@ class RouterBase {
throw new RouterException('Route or method not allowed', 403);
}
if(!$this->loadedRoute) {
if(!$this->request->loadedRoute) {
throw new RouterException(sprintf('Route not found: %s', $this->request->getUri()), 404);
}
}
@@ -178,8 +172,8 @@ class RouterBase {
* @return RouterEntry
*/
public function getLoadedRoute() {
if(!($this->loadedRoute instanceof RouterGroup)) {
return $this->loadedRoute;
if(!($this->request->loadedRoute instanceof RouterGroup)) {
return $this->request->loadedRoute;
}
return null;
}
@@ -327,8 +321,8 @@ class RouterBase {
return $url;
}
if($controller === null && $this->loadedRoute !== null) {
return $this->processUrl($this->loadedRoute, $this->loadedRoute->getMethod(), $parameters, $getParams);
if($controller === null && $this->request->loadedRoute !== null) {
return $this->processUrl($this->request->loadedRoute, $this->request->loadedRoute->getMethod(), $parameters, $getParams);
}
$c = '';
+1 -1
View File
@@ -43,7 +43,7 @@ class RouterController extends RouterEntry {
}
public function matchRoute(Request $request) {
$url = parse_url($request->getUri());
$url = parse_url(urldecode($request->getUri()));
$url = rtrim($url['path'], '/') . '/';
if(strtolower($url) == strtolower($this->url) || stripos($url, $this->url) === 0) {
+18 -8
View File
@@ -77,6 +77,16 @@ abstract class RouterEntry {
return null;
}
public function setMethod($method) {
$this->callback = sprintf('%s@%s', $this->getClass(), $method);
return $this;
}
public function setClass($class) {
$this->callback = sprintf('%s@%s', $class, $this->getMethod());
return $this;
}
/**
* @param string $prefix
* @return self
@@ -178,10 +188,6 @@ abstract class RouterEntry {
public function getMergeableSettings() {
$settings = $this->settings;
/*if(isset($settings['middleware'])) {
unset($settings['middleware']);
}*/
if(isset($settings['prefix'])) {
unset($settings['prefix']);
}
@@ -195,7 +201,7 @@ abstract class RouterEntry {
*/
public function addSettings(array $settings = null) {
if(is_array($settings)) {
$this->settings = array_merge($this->settings, $settings);
$this->settings = array_merge($settings, $this->settings);
}
return $this;
}
@@ -242,7 +248,7 @@ abstract class RouterEntry {
return new $name();
}
protected function parseParameters($route, $url, $parameterRegex = '[a-z0-9]*?') {
protected function parseParameters($route, $url, $parameterRegex = '[a-z0-9]+') {
$parameterNames = array();
$regex = '';
$lastCharacter = '';
@@ -278,7 +284,7 @@ abstract class RouterEntry {
if($lastCharacter === '?') {
$parameter = substr($parameter, 0, strlen($parameter)-1);
$regex .= '\\/(?:(?P<'.$parameter.'>[^\/]*)\\/?)';
$regex .= '(?:\\/?(?P<'.$parameter.'>[^\/]+)?\\/?)';
$required = false;
} else {
$regex .= '\\/(?P<' . $parameter . '>'. $parameterRegex .')\\/';
@@ -370,7 +376,11 @@ abstract class RouterEntry {
throw new RouterException(sprintf('Method %s does not exist in class %s', $method, $className), 404);
}
call_user_func_array(array($class, $method), $this->getParameters());
$parameters = array_filter($this->getParameters(), function($var){
return !is_null($var);
});
call_user_func_array(array($class, $method), $parameters);
return $class;
}
+6 -1
View File
@@ -66,7 +66,12 @@ class RouterGroup extends RouterEntry {
}
public function matchRoute(Request $request) {
return null;
// Skip if prefix doesn't match
if($this->getPrefix() !== null && stripos($request->getUri(), $this->getPrefix()) === false) {
return false;
}
return $this->matchDomain($request);
}
public function setExceptionHandler($class) {
+3 -3
View File
@@ -46,12 +46,12 @@ class RouterResource extends RouterEntry {
}
public function matchRoute(Request $request) {
$url = parse_url($request->getUri());
$url = parse_url(urldecode($request->getUri()));
$url = rtrim($url['path'], '/') . '/';
$route = rtrim($this->url, '/') . '/{id?}/{action?}';
$parameters = $this->parseParameters($route, $url, '[0-9]*?');
$parameters = $this->parseParameters($route, $url, '[0-9]+?');
if($parameters !== null) {
@@ -59,7 +59,7 @@ class RouterResource extends RouterEntry {
$parameters = array_merge($this->parameters, $parameters);
}
$action = $parameters['action'];
$action = isset($parameters['action']) ? $parameters['action'] : null;
unset($parameters['action']);
// Delete
+7 -5
View File
@@ -21,7 +21,7 @@ class RouterRoute extends RouterEntry {
public function matchRoute(Request $request) {
$url = parse_url($request->getUri());
$url = parse_url(urldecode($request->getUri()));
$url = rtrim($url['path'], '/') . '/';
// Match on custom defined regular expression
@@ -41,15 +41,17 @@ class RouterRoute extends RouterEntry {
if($parameters !== null) {
//if(is_array($this->parameters)) {
// $this->parameters = array_merge($this->parameters, $parameters);
//} else {
if(is_array($this->parameters)) {
$this->parameters = array_merge($this->parameters, $parameters);
} else {
$this->parameters = $parameters;
//}
}
return true;
}
return null;
}