From 980a4e9b6a2dc3d8b0e68311fcb2e9ebd5ae898e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20Sessing=C3=B8?= Date: Mon, 26 Sep 2016 14:37:54 +0200 Subject: [PATCH] Updated documentation and added demo-project. --- .gitignore | 3 +- README.md | 10 +- demo-project/README.md | 104 ++++++++++++++++++ .../app/Controllers/ApiController.php | 22 ++++ .../app/Controllers/DefaultController.php | 25 +++++ .../app/Handlers/CustomExceptionHandler.php | 28 +++++ .../app/Middlewares/ApiVerification.php | 16 +++ demo-project/app/Middlewares/CsrfVerifier.php | 13 +++ demo-project/app/Router.php | 84 ++++++++++++++ demo-project/app/routes.php | 19 ++++ demo-project/composer.json | 26 +++++ demo-project/public/.htaccess | 5 + demo-project/public/index.php | 7 ++ 13 files changed, 359 insertions(+), 3 deletions(-) create mode 100644 demo-project/README.md create mode 100644 demo-project/app/Controllers/ApiController.php create mode 100644 demo-project/app/Controllers/DefaultController.php create mode 100644 demo-project/app/Handlers/CustomExceptionHandler.php create mode 100644 demo-project/app/Middlewares/ApiVerification.php create mode 100644 demo-project/app/Middlewares/CsrfVerifier.php create mode 100644 demo-project/app/Router.php create mode 100644 demo-project/app/routes.php create mode 100644 demo-project/composer.json create mode 100644 demo-project/public/.htaccess create mode 100644 demo-project/public/index.php diff --git a/.gitignore b/.gitignore index 848a58c..f5da770 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .idea composer.lock -vendor/ \ No newline at end of file +vendor/ +demo-project/vendor \ No newline at end of file diff --git a/README.md b/README.md index 25c127f..a062bfb 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,14 @@ The goal of this project is to create a router that is 100% compatible with the - Custom boot managers to redirect urls to other routes - Input manager; to manage `GET`, `POST` params. +## Installation and demo + +We've included a simple demo project for the router which can be found in the `demo-project` folder. + +Please refer to the demo-project documentation for further reading on how to setup and install simple-php-router: + +[Link to demo documentation](demo-project/README.md) + ## Initialising the router In your ```index.php``` require your ```routes.php``` and call the ```routeRequest()``` method when all your custom routes has been loaded. This will trigger and do the actual routing of the requests. @@ -176,8 +184,6 @@ This is a simple example of an integration into a framework. The framework has it's own ```Router``` class which inherits from the ```SimpleRouter``` class. This allows the framework to add custom functionality. ```php - $request->authenticated + ]); + + } + +} \ No newline at end of file diff --git a/demo-project/app/Controllers/DefaultController.php b/demo-project/app/Controllers/DefaultController.php new file mode 100644 index 0000000..4d5856c --- /dev/null +++ b/demo-project/app/Controllers/DefaultController.php @@ -0,0 +1,25 @@ + index'; + + } + + public function contact() { + + echo 'DefaultController -> contact'; + + } + + public function companies($id = null) { + + echo 'DefaultController -> companies -> id: ' . $id; + + } + +} \ No newline at end of file diff --git a/demo-project/app/Handlers/CustomExceptionHandler.php b/demo-project/app/Handlers/CustomExceptionHandler.php new file mode 100644 index 0000000..f59901f --- /dev/null +++ b/demo-project/app/Handlers/CustomExceptionHandler.php @@ -0,0 +1,28 @@ +getUri(), '/api') !== false) { + header('content-type: application/json'); + echo json_encode([ + 'error' => $error->getMessage(), + 'code' => $error->getCode() + ]); + die(); + } + + // else we just throw the error + if($error->getCode() == 404) { + die(sprintf('An error occurred (%s):
%s', $error->getCode(), $error->getMessage())); + } + } + +} \ No newline at end of file diff --git a/demo-project/app/Middlewares/ApiVerification.php b/demo-project/app/Middlewares/ApiVerification.php new file mode 100644 index 0000000..c437a22 --- /dev/null +++ b/demo-project/app/Middlewares/ApiVerification.php @@ -0,0 +1,16 @@ +authenticated = true; + + } + +} \ No newline at end of file diff --git a/demo-project/app/Middlewares/CsrfVerifier.php b/demo-project/app/Middlewares/CsrfVerifier.php new file mode 100644 index 0000000..0c65ff7 --- /dev/null +++ b/demo-project/app/Middlewares/CsrfVerifier.php @@ -0,0 +1,13 @@ +handle(RouterBase::getInstance()->getRequest()); + } + } + + // Set default namespace + $defaultNamespace = '\\Demo\\Controllers'; + + parent::start($defaultNamespace); + } catch(\Exception $e) { + + $route = RouterBase::getInstance()->getLoadedRoute(); + + // Otherwise use the fallback default exceptions handler + if(static::$defaultExceptionHandler !== null) { + static::loadExceptionHandler(static::$defaultExceptionHandler, $route, $e); + } + + throw $e; + } + + } + + protected static function loadExceptionHandler($class, $route, $e) { + $class = new $class(); + + if(!($class instanceof IExceptionHandler)) { + throw new \ErrorException('Exception handler must be an instance of \Pecee\Handler\IExceptionHandler'); + } + + $class->handleError(RouterBase::getInstance()->getRequest(), $route, $e); + } + + public static function defaultExceptionHandler($handler) { + static::$defaultExceptionHandler = $handler; + } + + /** + * Add default middleware that will be loaded before any route + * @param string|array $middlewares + */ + public static function defaultMiddleware($middlewares) { + if(is_array($middlewares)) { + static::$defaultMiddlewares = $middlewares; + } else { + static::$defaultMiddlewares[] = $middlewares; + } + } + +} \ No newline at end of file diff --git a/demo-project/app/routes.php b/demo-project/app/routes.php new file mode 100644 index 0000000..0ed150d --- /dev/null +++ b/demo-project/app/routes.php @@ -0,0 +1,19 @@ +setAlias('home'); +Router::get('/contact', 'DefaultController@contact')->setAlias('contact'); +Router::basic('/companies', 'DefaultController@companies')->setAlias('companies'); +Router::basic('/companies/{id}', 'DefaultController@companies')->setAlias('companies'); + +// Api +Router::group(['prefix' => '/api', 'middleware' => 'Demo\Middlewares\ApiVerification'], function() { + Router::resource('/demo', 'ApiController'); +}); \ No newline at end of file diff --git a/demo-project/composer.json b/demo-project/composer.json new file mode 100644 index 0000000..94bd113 --- /dev/null +++ b/demo-project/composer.json @@ -0,0 +1,26 @@ +{ + "name": "pecee/simple-router-demo", + "description": "Simple router demo project", + "keywords": [ + "simple-router", + "php", + "php-simple-router" + ], + "license": "MIT", + "type": "project", + "require": { + "php": ">=5.4.0", + "pecee/simple-router": "1.*" + }, + "require-dev": { + + }, + "config": { + "preferred-install": "dist" + }, + "autoload": { + "psr-4": { + "Demo\\": "app/" + } + } +} \ No newline at end of file diff --git a/demo-project/public/.htaccess b/demo-project/public/.htaccess new file mode 100644 index 0000000..aa7a5f6 --- /dev/null +++ b/demo-project/public/.htaccess @@ -0,0 +1,5 @@ +RewriteEngine on +RewriteCond %{SCRIPT_FILENAME} !-f +RewriteCond %{SCRIPT_FILENAME} !-d +RewriteCond %{SCRIPT_FILENAME} !-l +RewriteRule ^(.*)$ index.php/$1 \ No newline at end of file diff --git a/demo-project/public/index.php b/demo-project/public/index.php new file mode 100644 index 0000000..ea01d8d --- /dev/null +++ b/demo-project/public/index.php @@ -0,0 +1,7 @@ +