From 8557741083670726f4a4bee18dd0306712788924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Sessing=C3=B8?= Date: Sun, 1 Nov 2015 08:23:46 +0100 Subject: [PATCH] [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. --- .../Http/Middleware/BaseCsrfVerifier.php | 2 +- src/Pecee/Http/Middleware/IMiddleware.php | 8 +++++++ src/Pecee/SimpleRouter/RouterBase.php | 2 +- src/Pecee/SimpleRouter/RouterController.php | 23 +++++++++++++++++++ src/Pecee/SimpleRouter/RouterEntry.php | 6 ++--- src/Pecee/SimpleRouter/RouterGroup.php | 2 +- 6 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 src/Pecee/Http/Middleware/IMiddleware.php diff --git a/src/Pecee/Http/Middleware/BaseCsrfVerifier.php b/src/Pecee/Http/Middleware/BaseCsrfVerifier.php index 33b0bed..cebd3a8 100644 --- a/src/Pecee/Http/Middleware/BaseCsrfVerifier.php +++ b/src/Pecee/Http/Middleware/BaseCsrfVerifier.php @@ -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'; diff --git a/src/Pecee/Http/Middleware/IMiddleware.php b/src/Pecee/Http/Middleware/IMiddleware.php new file mode 100644 index 0000000..ba55a8d --- /dev/null +++ b/src/Pecee/Http/Middleware/IMiddleware.php @@ -0,0 +1,8 @@ +loadedRoute !== null) { return $this->processUrl($this->loadedRoute, null, $getParams); } diff --git a/src/Pecee/SimpleRouter/RouterController.php b/src/Pecee/SimpleRouter/RouterController.php index dd69364..8de1c01 100644 --- a/src/Pecee/SimpleRouter/RouterController.php +++ b/src/Pecee/SimpleRouter/RouterController.php @@ -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'], '/') . '/'; diff --git a/src/Pecee/SimpleRouter/RouterEntry.php b/src/Pecee/SimpleRouter/RouterEntry.php index 825f296..4a73043 100644 --- a/src/Pecee/SimpleRouter/RouterEntry.php +++ b/src/Pecee/SimpleRouter/RouterEntry.php @@ -2,7 +2,7 @@ namespace Pecee\SimpleRouter; -use Pecee\Http\Middleware\Middleware; +use Pecee\Http\Middleware\IMiddleware; use Pecee\Http\Request; abstract class RouterEntry { @@ -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']); } @@ -246,7 +246,7 @@ abstract class RouterEntry { public function loadMiddleware(Request $request) { if($this->getMiddleware()) { $middleware = $this->loadClass($this->getMiddleware()); - if (!($middleware instanceof Middleware)) { + if (!($middleware instanceof IMiddleware)) { throw new RouterException($this->getMiddleware() . ' must be instance of Middleware'); } diff --git a/src/Pecee/SimpleRouter/RouterGroup.php b/src/Pecee/SimpleRouter/RouterGroup.php index d9f615a..07de6fb 100644 --- a/src/Pecee/SimpleRouter/RouterGroup.php +++ b/src/Pecee/SimpleRouter/RouterGroup.php @@ -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);