From 8740db95824612b2952c03e4ee7762c3d794339b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Sessing=C3=B8?= Date: Mon, 7 Nov 2016 04:40:28 +0100 Subject: [PATCH] Development - Isolated Http classes from router. - Removed getInstance from Request object - current router request should now be obtained through SimpleRouter::request(). - Fixed broken test cases. - Added test for regular expression match. - Updated documentation to reflect changes. - Added more helper examples to documentation. - Added helpers to demo-project. - Optimisations. --- README.md | 47 ++++++++++------ .../app/Controllers/ApiController.php | 4 +- demo-project/app/Router.php | 6 ++- demo-project/app/helpers.php | 31 +++++++++++ src/Pecee/Http/Input/Input.php | 10 +++- src/Pecee/Http/Request.php | 15 +----- src/Pecee/Http/Response.php | 8 ++- src/Pecee/SimpleRouter/RouterBase.php | 42 +++++++++++---- src/Pecee/SimpleRouter/SimpleRouter.php | 12 +++++ test/GroupTest.php | 5 +- test/MiddlewareTest.php | 5 +- test/RouterRouteTest.php | 53 +++++++++++-------- 12 files changed, 163 insertions(+), 75 deletions(-) create mode 100644 demo-project/app/helpers.php diff --git a/README.md b/README.md index cfb0fbf..5c6e043 100644 --- a/README.md +++ b/README.md @@ -208,15 +208,12 @@ class Router extends SimpleRouter { **This is a basic example of a helper function for generating urls.** ```php -use Pecee\SimpleRouter\RouterBase; +use Pecee\SimpleRouter\SimpleRouter; + function url($controller, $parameters = null, $getParams = null) { - RouterBase::getInstance()->getRoute($controller, $parameters, $getParams); + SimpleRouter::getRoute($controller, $parameters, $getParams); } -``` -**This is a basic example for getting the current csrf token** - -```php /** * Get current csrf-token * @return null|string @@ -225,6 +222,22 @@ function csrf_token() { $token = new \Pecee\CsrfToken(); return $token->getToken(); } + +/** + * Get request object + * @return \Pecee\Http\Request + */ +function request() { + return SimpleRouter::request(); +} + +/** + * Get response object + * @return \Pecee\Http\Response + */ +function response() { + return SimpleRouter::response(); +} ``` ## Getting urls @@ -327,12 +340,14 @@ SimpleRouter::get('/article/view/{id}', 'ControllerArticle@view'); ## 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. +the ```\Pecee\SimpleRouter\Http\Request``` object. All information about the current route is as a ```\Pecee\SimpleRouter\Http\Request``` object which can always be obtained on +the `RouterBase` instance. For easy access you can use the shortcut method `\Pecee\SimpleRouter\SimpleRouter::request()`. **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(); +use Pecee\SimpleRouter; +$route = SimpleRouter::request()->getLoadedRoute(); $route->setCallback('Example\MyCustomClass@hello'); @@ -348,28 +363,28 @@ We've added the `Input` class to easy access parameters from your Controller-cla **Return single parameter value (matches both GET, POST, FILE):** ```php -$value = Request::getInstance()->getInput()->get('name'); +$value = SimpleRouter::request()->getInput()->get('name'); ``` **Return parameter object (matches both GET, POST, FILE):** ```php -$object = Request::getInstance()->getInput()->getObject('name'); +$object = SimpleRouter::request()->getInput()->getObject('name'); ``` **Return specific GET parameter (where name is the name of your parameter):** ```php -$object = Request::getInstance()->getInput()->get->name; -$object = Request::getInstance()->getInput()->post->name; -$object = Request::getInstance()->getInput()->file->name; +$object = SimpleRouter::request()->getInput()->get->name; +$object = SimpleRouter::request()->getInput()->post->name; +$object = SimpleRouter::request()->getInput()->file->name; ``` **Return all parameters:** ```php // Get all -$objects = Request::getInstance()->getInput()->all(); +$objects = SimpleRouter::request()->getInput()->all(); // Only match certain keys -$objects = Request::getInstance()->getInput()->all([ +$objects = SimpleRouter::request()->getInput()->all([ 'company_name', 'user_id' ]); @@ -400,7 +415,7 @@ Example: * @return \Pecee\Http\Input\Input */ function input() { - return \Pecee\Http\Request::getInstance()->getInput(); + return SimpleRouter::request()->getInput(); } ``` diff --git a/demo-project/app/Controllers/ApiController.php b/demo-project/app/Controllers/ApiController.php index 13048ab..e06b241 100644 --- a/demo-project/app/Controllers/ApiController.php +++ b/demo-project/app/Controllers/ApiController.php @@ -1,7 +1,7 @@ getToken(); +} + +/** + * Get request object + * @return \Pecee\Http\Request + */ +function request() { + return SimpleRouter::request(); +} + +/** + * Get response object + * @return \Pecee\Http\Response + */ +function response() { + return SimpleRouter::response(); +} \ No newline at end of file diff --git a/src/Pecee/Http/Input/Input.php b/src/Pecee/Http/Input/Input.php index caed6bc..4d4fc8d 100644 --- a/src/Pecee/Http/Input/Input.php +++ b/src/Pecee/Http/Input/Input.php @@ -20,7 +20,13 @@ class Input { */ public $file; - public function __construct() { + /** + * @var Request + */ + protected $request; + + public function __construct(Request &$request) { + $this->request = $request; $this->setGet(); $this->setPost(); $this->setFile(); @@ -58,7 +64,7 @@ class Input { return ($key !== null) ? $element[$key] : $element; } - if(Request::getInstance()->getMethod() !== 'get') { + if($this->request->getMethod() !== 'get') { $element = $this->post->findFirst($index); diff --git a/src/Pecee/Http/Request.php b/src/Pecee/Http/Request.php index 49c284b..c6cb59b 100644 --- a/src/Pecee/Http/Request.php +++ b/src/Pecee/Http/Request.php @@ -5,28 +5,15 @@ use Pecee\Http\Input\Input; class Request { - protected static $instance; - protected $data; - /** - * 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 = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : array(); $this->uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : array(); $this->method = (isset($_POST['_method'])) ? strtolower($_POST['_method']) : (isset($_SERVER['REQUEST_METHOD']) ? strtolower($_SERVER['REQUEST_METHOD']) : array()); $this->headers = $this->getAllHeaders(); - $this->input = new Input(); + $this->input = new Input($this); } protected function getAllHeaders() { diff --git a/src/Pecee/Http/Response.php b/src/Pecee/Http/Response.php index c60743d..ba7bfeb 100644 --- a/src/Pecee/Http/Response.php +++ b/src/Pecee/Http/Response.php @@ -4,6 +4,12 @@ namespace Pecee\Http; class Response { + protected $request; + + public function __construct(Request &$request) { + $this->request = $request; + } + /** * Set the http status code * @@ -31,7 +37,7 @@ class Response { } public function refresh() { - $this->redirect(Request::getInstance()->getUri()); + $this->redirect($this->request->getUri()); } /** diff --git a/src/Pecee/SimpleRouter/RouterBase.php b/src/Pecee/SimpleRouter/RouterBase.php index e618d94..75e718a 100644 --- a/src/Pecee/SimpleRouter/RouterBase.php +++ b/src/Pecee/SimpleRouter/RouterBase.php @@ -5,12 +5,14 @@ use Pecee\Exception\RouterException; use Pecee\Handler\IExceptionHandler; use Pecee\Http\Middleware\BaseCsrfVerifier; use Pecee\Http\Request; +use Pecee\Http\Response; class RouterBase { protected static $instance; protected $request; + protected $response; protected $currentRoute; protected $routes; protected $processedRoutes; @@ -21,10 +23,13 @@ class RouterBase { protected $baseCsrfVerifier; protected $exceptionHandlers; - // TODO: clean up - cut some of the methods down to smaller pieces - public function __construct() { - $this->request = Request::getInstance(); + $this->reset(); + } + + public function reset() { + $this->request = new Request(); + $this->response = new Response($this->request); $this->routes = array(); $this->backStack = array(); $this->controllerUrlMap = array(); @@ -289,6 +294,14 @@ class RouterBase { return $this->request; } + /** + * Get response + * @return Response + */ + public function getResponse() { + return $this->response; + } + /** * Get base csrf verifier class * @return BaseCsrfVerifier @@ -341,10 +354,10 @@ class RouterBase { $url = $domain . '/' . trim($route->getUrl(), '/'); if(($route instanceof RouterController || $route instanceof RouterResource) && $method !== null) { - $url .= $method; - } + if($method !== null) { + $url .= $method; + } - if($route instanceof RouterController || $route instanceof RouterResource) { if(count($parameters)) { $url .= join('/', $parameters); } @@ -419,12 +432,15 @@ class RouterBase { $route = $this->controllerUrlMap[$i]; // Check an alias exist, if the matches - use it - if($route instanceof RouterRoute && $route->hasAlias($controller)) { - return $this->processUrl($route, $route->getMethod(), $parameters, $getParams); - } + if($route instanceof RouterRoute) { - if($route instanceof RouterRoute && !is_callable($route->getCallback()) && stripos($route->getCallback(), '@') !== false) { - $c = $route->getCallback(); + if($route->hasAlias($controller)) { + return $this->processUrl($route, $route->getMethod(), $parameters, $getParams); + } + + if(!is_callable($route->getCallback()) && stripos($route->getCallback(), '@') !== false) { + $c = $route->getCallback(); + } } else if($route instanceof RouterController || $route instanceof RouterResource) { $c = $route->getController(); } @@ -476,6 +492,10 @@ class RouterBase { return $url; } + /** + * Get current router instance + * @return static + */ public static function getInstance() { if(static::$instance === null) { static::$instance = new static(); diff --git a/src/Pecee/SimpleRouter/SimpleRouter.php b/src/Pecee/SimpleRouter/SimpleRouter.php index aca2cfb..a173be0 100644 --- a/src/Pecee/SimpleRouter/SimpleRouter.php +++ b/src/Pecee/SimpleRouter/SimpleRouter.php @@ -13,6 +13,10 @@ use Pecee\Http\Middleware\BaseCsrfVerifier; class SimpleRouter { + public function __construct() { + die('test'); + } + /** * Start/route request * @param null $defaultNamespace @@ -128,4 +132,12 @@ class SimpleRouter { return RouterBase::getInstance()->getRoute($controller, $parameters, $getParams); } + public static function request() { + return RouterBase::getInstance()->getRequest(); + } + + public static function response() { + return RouterBase::getInstance()->getResponse(); + } + } \ No newline at end of file diff --git a/test/GroupTest.php b/test/GroupTest.php index e1ce45d..b9f6c23 100644 --- a/test/GroupTest.php +++ b/test/GroupTest.php @@ -28,8 +28,9 @@ class GroupTest extends PHPUnit_Framework_TestCase { public function testNestedGroup() { - \Pecee\SimpleRouter\RouterBase::getInstance()->getRequest()->setUri('/api/v1/test'); - \Pecee\SimpleRouter\RouterBase::getInstance()->getRequest()->setMethod('get'); + \Pecee\SimpleRouter\RouterBase::getInstance()->reset(); + \Pecee\SimpleRouter\SimpleRouter::request()->setUri('/api/v1/test'); + \Pecee\SimpleRouter\SimpleRouter::request()->setMethod('get'); \Pecee\SimpleRouter\SimpleRouter::group(['prefix' => '/api'], function() { \Pecee\SimpleRouter\SimpleRouter::group(['prefix' => '/v1'], function() { diff --git a/test/MiddlewareTest.php b/test/MiddlewareTest.php index 287f899..6e18f71 100644 --- a/test/MiddlewareTest.php +++ b/test/MiddlewareTest.php @@ -8,8 +8,9 @@ class MiddlewareTest extends PHPUnit_Framework_TestCase { public function testMiddlewareFound() { - \Pecee\Http\Request::getInstance()->setMethod('get'); - \Pecee\Http\Request::getInstance()->setUri('/my/test/url'); + \Pecee\SimpleRouter\RouterBase::getInstance()->reset(); + \Pecee\SimpleRouter\SimpleRouter::request()->setMethod('get'); + \Pecee\SimpleRouter\SimpleRouter::request()->setUri('/my/test/url'); \Pecee\SimpleRouter\SimpleRouter::group(['exceptionHandler' => 'ExceptionHandler'], function() { \Pecee\SimpleRouter\SimpleRouter::get('/my/test/url', 'DummyController@start', ['middleware' => 'DummyMiddleware']); diff --git a/test/RouterRouteTest.php b/test/RouterRouteTest.php index ffa0299..e0ae29d 100644 --- a/test/RouterRouteTest.php +++ b/test/RouterRouteTest.php @@ -5,12 +5,12 @@ require_once 'Dummy/DummyController.php'; require_once 'Dummy/Handler/ExceptionHandler.php'; class RouterRouteTest extends PHPUnit_Framework_TestCase { - + public function testNotFound() { - - \Pecee\Http\Request::getInstance()->setMethod('get'); - \Pecee\Http\Request::getInstance()->setUri('/test-param1-param2'); + \Pecee\SimpleRouter\RouterBase::getInstance()->reset(); + \Pecee\SimpleRouter\SimpleRouter::request()->setMethod('get'); + \Pecee\SimpleRouter\SimpleRouter::request()->setUri('/test-param1-param2'); \Pecee\SimpleRouter\SimpleRouter::group(['exceptionHandler' => 'ExceptionHandler'], function() { \Pecee\SimpleRouter\SimpleRouter::get('/non-existing-path', 'DummyController@start'); @@ -29,33 +29,36 @@ class RouterRouteTest extends PHPUnit_Framework_TestCase { } public function testGet() { - - \Pecee\SimpleRouter\RouterBase::getInstance()->getRequest()->setUri('/my/test/url'); - \Pecee\SimpleRouter\RouterBase::getInstance()->getRequest()->setMethod('get'); + \Pecee\SimpleRouter\RouterBase::getInstance()->reset(); + \Pecee\SimpleRouter\SimpleRouter::request()->setUri('/my/test/url'); + \Pecee\SimpleRouter\SimpleRouter::request()->setMethod('get'); \Pecee\SimpleRouter\SimpleRouter::get('/my/test/url', 'DummyController@start'); \Pecee\SimpleRouter\SimpleRouter::start(); } public function testPost() { - \Pecee\SimpleRouter\RouterBase::getInstance()->getRequest()->setUri('/my/test/url'); - \Pecee\Http\Request::getInstance()->setMethod('post'); + \Pecee\SimpleRouter\RouterBase::getInstance()->reset(); + \Pecee\SimpleRouter\SimpleRouter::request()->setUri('/my/test/url'); + \Pecee\SimpleRouter\SimpleRouter::request()->setMethod('post'); \Pecee\SimpleRouter\SimpleRouter::post('/my/test/url', 'DummyController@start'); \Pecee\SimpleRouter\SimpleRouter::start(); } public function testPut() { - \Pecee\SimpleRouter\RouterBase::getInstance()->getRequest()->setUri('/my/test/url'); - \Pecee\Http\Request::getInstance()->setMethod('put'); + \Pecee\SimpleRouter\RouterBase::getInstance()->reset(); + \Pecee\SimpleRouter\SimpleRouter::request()->setUri('/my/test/url'); + \Pecee\SimpleRouter\SimpleRouter::request()->setMethod('put'); \Pecee\SimpleRouter\SimpleRouter::put('/my/test/url', 'DummyController@start'); \Pecee\SimpleRouter\SimpleRouter::start(); } public function testDelete() { - \Pecee\SimpleRouter\RouterBase::getInstance()->getRequest()->setUri('/my/test/url'); - \Pecee\Http\Request::getInstance()->setMethod('delete'); + \Pecee\SimpleRouter\RouterBase::getInstance()->reset(); + \Pecee\SimpleRouter\SimpleRouter::request()->setUri('/my/test/url'); + \Pecee\SimpleRouter\SimpleRouter::request()->setMethod('delete'); \Pecee\SimpleRouter\SimpleRouter::delete('/my/test/url', 'DummyController@start'); \Pecee\SimpleRouter\SimpleRouter::start(); @@ -63,8 +66,9 @@ class RouterRouteTest extends PHPUnit_Framework_TestCase { } public function testMethodNotAllowed() { - \Pecee\SimpleRouter\RouterBase::getInstance()->getRequest()->setUri('/my/test/url'); - \Pecee\Http\Request::getInstance()->setMethod('post'); + \Pecee\SimpleRouter\RouterBase::getInstance()->reset(); + \Pecee\SimpleRouter\SimpleRouter::request()->setUri('/my/test/url'); + \Pecee\SimpleRouter\SimpleRouter::request()->setMethod('post'); \Pecee\SimpleRouter\SimpleRouter::get('/my/test/url', 'DummyController@start'); @@ -78,8 +82,9 @@ class RouterRouteTest extends PHPUnit_Framework_TestCase { public function testSimpleParam() { - \Pecee\Http\Request::getInstance()->setMethod('get'); - \Pecee\Http\Request::getInstance()->setUri('/test-param1'); + \Pecee\SimpleRouter\RouterBase::getInstance()->reset(); + \Pecee\SimpleRouter\SimpleRouter::request()->setMethod('get'); + \Pecee\SimpleRouter\SimpleRouter::request()->setUri('/test-param1'); \Pecee\SimpleRouter\SimpleRouter::get('/test-{param1}', 'DummyController@param'); \Pecee\SimpleRouter\SimpleRouter::start(); @@ -88,20 +93,22 @@ class RouterRouteTest extends PHPUnit_Framework_TestCase { public function testMultiParam() { - \Pecee\Http\Request::getInstance()->setMethod('get'); - \Pecee\Http\Request::getInstance()->setUri('/test-param1-param2'); + \Pecee\SimpleRouter\RouterBase::getInstance()->reset(); + \Pecee\SimpleRouter\SimpleRouter::request()->setMethod('get'); + \Pecee\SimpleRouter\SimpleRouter::request()->setUri('/test-param1-param2'); \Pecee\SimpleRouter\SimpleRouter::get('/test-{param1}-{param2}', 'DummyController@param'); \Pecee\SimpleRouter\SimpleRouter::start(); } - public function testPathParam() { + public function testPathParamRegex() { - \Pecee\Http\Request::getInstance()->setMethod('get'); - \Pecee\Http\Request::getInstance()->setUri('/test/path/param1'); + \Pecee\SimpleRouter\RouterBase::getInstance()->reset(); + \Pecee\SimpleRouter\SimpleRouter::request()->setMethod('get'); + \Pecee\SimpleRouter\SimpleRouter::request()->setUri('/test/path/123123'); - \Pecee\SimpleRouter\SimpleRouter::get('/test/path/{param}', 'DummyController@param'); + \Pecee\SimpleRouter\SimpleRouter::get('/test/path/{myParam}', 'DummyController@param', ['where' => ['myParam' => '([0-9]+)']]); \Pecee\SimpleRouter\SimpleRouter::start(); }