Compare commits

...

13 Commits

Author SHA1 Message Date
Simon Sessingø 1d338e9aa9 Merge pull request #26 from skipperbent/development
[OPTIMISATION] Fixed Group only loading middleware when initialised.
2015-11-01 10:24:51 +01:00
Simon Sessingø 889ceaa37f [OPTIMISATION] Fixed Group only loading middleware when initialised. 2015-11-01 10:24:05 +01:00
Simon Sessingø 363338c92f Merge pull request #25 from skipperbent/development
Development
2015-11-01 10:14:57 +01:00
Simon Sessingø 3dd9dba029 [FEATURE] All headers in Request class now has lowercased keys. 2015-11-01 10:13:00 +01:00
Simon Sessingø be277f276f [FEATURE] Added support for patch.
- Put now also allow patch request types.
2015-11-01 09:21:47 +01:00
Simon Sessingø f215eaa9cf [BUGFIX] Bugfixes and optimisations
- Fixed support for multiple middlewares using array.
- Fixed match and parameters-match not not being merged when used on group.
2015-11-01 09:11:17 +01:00
Simon Sessingø 933f2370fe Merge pull request #24 from skipperbent/development
Development
2015-11-01 08:29:19 +01:00
Simon Sessingø b3f8910cab [TASK] Removed Middleware class. 2015-11-01 08:28:28 +01:00
Simon Sessingø 8557741083 [FEATURE] Bugfixes and optimisations
- Changed Middleware to interface - as it's easier to inherit and use in
  other frameworks/projects.

- RouterController now loads method based on request-method.

- Changed references to old Middleware abstract class.

- Middleware must now be instance of IMiddleware instead of Middleware
  class.
2015-11-01 08:23:46 +01:00
Simon Sessingø c60d7d81c1 Merge pull request #23 from skipperbent/development
[BUGFIX] Optimised getRoute for custom urls.
2015-11-01 07:49:21 +01:00
Simon Sessingø 637b998f02 [TASK] Made RouterBase use singleton HttpRequest class. 2015-11-01 07:48:29 +01:00
Simon Sessingø aca7d3d503 [FEATURE] Added magic method getters and setters, and made request a
singleton applied configuration can be availible from everywhere.
2015-11-01 07:44:13 +01:00
Simon Sessingø 846c9e6584 [BUGFIX] Optimised getRoute for custom urls. 2015-11-01 07:36:13 +01:00
9 changed files with 93 additions and 33 deletions
@@ -5,7 +5,7 @@ use Pecee\CsrfToken;
use Pecee\Exception\TokenMismatchException;
use Pecee\Http\Request;
class BaseCsrfVerifier extends Middleware {
class BaseCsrfVerifier implements IMiddleware {
const POST_KEY = 'csrf-token';
const HEADER_KEY = 'X-CSRF-TOKEN';
@@ -0,0 +1,8 @@
<?php
namespace Pecee\Http\Middleware;
use Pecee\Http\Request;
interface IMiddleware {
public function handle(Request $request);
}
-11
View File
@@ -1,11 +0,0 @@
<?php
namespace Pecee\Http\Middleware;
use Pecee\Http\Request;
use Pecee\SimpleRouter\RouterEntry;
abstract class Middleware
{
abstract function handle(Request $request);
}
+25 -2
View File
@@ -3,16 +3,31 @@ namespace Pecee\Http;
class Request {
protected static $instance;
protected $data;
protected $uri;
protected $host;
protected $method;
protected $headers;
/**
* Return new instance
* @return static
*/
public static function getInstance() {
if(self::$instance === null) {
self::$instance = new static();
}
return self::$instance;
}
public function __construct() {
$this->data = array();
$this->host = $_SERVER['HTTP_HOST'];
$this->uri = $_SERVER['REQUEST_URI'];
$this->method = (isset($_POST['_method'])) ? strtolower($_POST['_method']) : strtolower($_SERVER['REQUEST_METHOD']);
$this->headers = getallheaders();
$this->headers = array_change_key_case(getallheaders(), CASE_LOWER);
}
/**
@@ -90,7 +105,7 @@ class Request {
* @return string|null
*/
public function getHeader($name) {
return (isset($this->headers[$name])) ? $this->headers[$name] : null;
return (isset($this->headers[strtolower($name)])) ? $this->headers[strtolower($name)] : null;
}
/**
@@ -103,4 +118,12 @@ class Request {
return (isset($_REQUEST[$name]) ? $_REQUEST[$name] : $defaultValue);
}
public function __set($name, $value = null) {
$this->data[$name] = $value;
}
public function __get($name) {
return isset($this->data[$name]) ? $this->data[$name] : null;
}
}
+10 -3
View File
@@ -27,7 +27,7 @@ class RouterBase {
$this->routes = array();
$this->backstack = array();
$this->controllerUrlMap = array();
$this->request = new Request();
$this->request = Request::getInstance();
$this->baseCsrfVerifier = new BaseCsrfVerifier();
}
@@ -58,6 +58,7 @@ class RouterBase {
$newPrefixes = $prefixes;
$mergedSettings = array_merge($settings, $route->getMergeableSettings());
if($route->getPrefix()) {
array_push($newPrefixes, rtrim($route->getPrefix(), '/'));
}
@@ -295,7 +296,7 @@ class RouterBase {
$method = $tmp[1];
}
if($controller === $c && $route !== null) {
if($controller === $c) {
return $this->processUrl($route, $method, $parameters, $getParams);
}
}
@@ -307,7 +308,13 @@ class RouterBase {
ArrayUtil::append($url, $parameters);
}
return '/' . join('/', $url);
$url = '/' . trim(join('/', $url), '/') . '/';
if(is_array($getParams)) {
$url .= '?' . Url::arrayToParams($getParams);
}
return $url;
}
public static function getInstance() {
@@ -17,6 +17,29 @@ class RouterController extends RouterEntry {
$this->controller = $controller;
}
public function renderRoute(Request $request) {
if(is_object($this->getCallback()) && is_callable($this->getCallback())) {
// When the callback is a function
call_user_func_array($this->getCallback(), $this->getParameters());
} else {
// When the callback is a method
$controller = explode('@', $this->getCallback());
$className = $this->getNamespace() . '\\' . $controller[0];
$class = $this->loadClass($className);
$method = $request->getMethod() . ucfirst($controller[1]);
if (!method_exists($class, $method)) {
throw new RouterException(sprintf('Method %s does not exist in class %s', $method, $className), 404);
}
call_user_func_array(array($class, $method), $this->getParameters());
return $class;
}
}
public function matchRoute(Request $request) {
$url = parse_url($request->getUri());
$url = rtrim($url['path'], '/') . '/';
+24 -12
View File
@@ -2,7 +2,7 @@
namespace Pecee\SimpleRouter;
use Pecee\Http\Middleware\Middleware;
use Pecee\Http\Middleware\IMiddleware;
use Pecee\Http\Request;
abstract class RouterEntry {
@@ -10,26 +10,26 @@ abstract class RouterEntry {
const REQUEST_TYPE_POST = 'post';
const REQUEST_TYPE_GET = 'get';
const REQUEST_TYPE_PUT = 'put';
const REQUEST_TYPE_PATCH = 'patch';
const REQUEST_TYPE_DELETE = 'delete';
public static $allowedRequestTypes = array(
self::REQUEST_TYPE_DELETE,
self::REQUEST_TYPE_GET,
self::REQUEST_TYPE_POST,
self::REQUEST_TYPE_PUT
self::REQUEST_TYPE_PUT,
self::REQUEST_TYPE_PATCH
);
protected $settings;
protected $callback;
protected $parameters;
protected $parametersRegex;
protected $regexMatch;
public function __construct() {
$this->settings = array();
$this->settings['requestMethods'] = array();
$this->settings['parametersRegex'] = array();
$this->parameters = array();
$this->parametersRegex = array();
}
/**
@@ -208,7 +208,7 @@ abstract class RouterEntry {
public function setSettings($settings) {
$this->settings = $settings;
if($settings['prefix']) {
if(isset($settings['prefix'])) {
$this->setPrefix($settings['prefix']);
}
@@ -245,13 +245,25 @@ abstract class RouterEntry {
public function loadMiddleware(Request $request) {
if($this->getMiddleware()) {
$middleware = $this->loadClass($this->getMiddleware());
if (!($middleware instanceof Middleware)) {
throw new RouterException($this->getMiddleware() . ' must be instance of Middleware');
}
if(is_array($this->getMiddleware())) {
foreach($this->getMiddleware() as $middleware) {
$middleware = $this->loadClass($middleware);
if (!($middleware instanceof IMiddleware)) {
throw new RouterException($middleware . ' must be instance of Middleware');
}
/* @var $class Middleware */
$middleware->handle($request);
/* @var $class Middleware */
$middleware->handle($request);
}
} else {
$middleware = $this->loadClass($this->getMiddleware());
if (!($middleware instanceof IMiddleware)) {
throw new RouterException($this->getMiddleware() . ' must be instance of Middleware');
}
/* @var $class Middleware */
$middleware->handle($request);
}
}
}
+1 -3
View File
@@ -13,7 +13,7 @@ class RouterGroup extends RouterEntry {
public function renderRoute(Request $request) {
// Check if request method is allowed
if(strtolower($request->getUri()) == strtolower($this->prefix) || stripos($request->getUri(), $this->prefix) === 0) {
if(trim($this->prefix) === '' || strtolower($request->getUri()) == strtolower($this->prefix) || stripos($request->getUri(), $this->prefix) === 0) {
$hasAccess = (!$this->method);
@@ -29,8 +29,6 @@ class RouterGroup extends RouterEntry {
throw new RouterException('Method not allowed');
}
$this->loadMiddleware($request);
return parent::renderRoute($request);
}
+1 -1
View File
@@ -57,7 +57,7 @@ class SimpleRouter {
public static function put($url, $callback, array $settings = null) {
$route = new RouterRoute($url, $callback);
$route->addSettings($settings);
$route->setRequestMethods(array(RouterRoute::REQUEST_TYPE_PUT));
$route->setRequestMethods(array(RouterRoute::REQUEST_TYPE_PUT, RouterRoute::REQUEST_TYPE_PATCH));
$router = RouterBase::getInstance();
$router->addRoute($route);