- Simplified exception-handling (see demo project for examples).
- Optimised sample-project.
- Optimised and added further unit-tests.
- Optimised and bugfixes.
This commit is contained in:
Simon Sessingø
2016-10-20 08:31:21 +02:00
parent 4e054dccf5
commit a8620cbc70
13 changed files with 151 additions and 175 deletions
+3 -2
View File
@@ -18,7 +18,7 @@ Please note that this demo-project only covers how to integrate the `simple-php-
## Installation
- Navigate to the `demo-project` folder in terminal and run `composer install`.
- Navigate to the `demo-project` folder in terminal and run `composer update` to install the latest version.
- Point your webserver to `demo-project/public`.
### Setting up Nginx
@@ -46,7 +46,8 @@ Nothing special is required for Apache to work. We've include the `.htaccess` fi
## Notes
The demo project has it's own `Router` class implementation which extends the `SimpleRouter` class with further functionality such as default exceptionhandlers and middlewares. This class can be useful adding additional functionality that are required before and after routing occurs or any extra functionality belonging to the router itself.
The demo project has it's own `Router` class implementation which extends the `SimpleRouter` class with further functionality.
This class can be useful adding additional functionality that are required before and after routing occurs or any extra functionality belonging to the router itself.
In this project we also use our custom router-class to autoload the `routes.php` file from our custom location (`app/routes.php`).
@@ -22,4 +22,8 @@ class DefaultController {
}
public function notFound() {
echo 'Page not found';
}
}
@@ -21,8 +21,14 @@ class CustomExceptionHandler implements IExceptionHandler {
// else we just throw the error
if($error->getCode() == 404) {
die(sprintf('An error occurred (%s):<br/>%s', $error->getCode(), $error->getMessage()));
// Return 404 path
$request->setUri('/404');
return $request;
}
throw $error;
}
}
+10 -39
View File
@@ -8,14 +8,12 @@
namespace Demo;
use Pecee\Exception\RouterException;
use Pecee\Handler\IExceptionHandler;
use Pecee\Http\Middleware\IMiddleware;
use Pecee\SimpleRouter\RouterBase;
use Pecee\SimpleRouter\SimpleRouter;
class Router extends SimpleRouter {
protected static $defaultExceptionHandler;
protected static $defaultMiddlewares = array();
public static function start($defaultNamespace = null) {
@@ -23,50 +21,23 @@ class Router extends SimpleRouter {
// change this to whatever makes sense in your project
require_once 'routes.php';
// Handle exceptions
try {
if(count(static::$defaultMiddlewares)) {
/* @var $middleware \Pecee\Http\Middleware\IMiddleware */
foreach(static::$defaultMiddlewares as $middleware) {
$middleware = new $middleware();
if(!($middleware instanceof IMiddleware)) {
throw new RouterException('Middleware must be implement the IMiddleware interface.');
}
$middleware->handle(RouterBase::getInstance()->getRequest());
if(count(static::$defaultMiddlewares)) {
/* @var $middleware \Pecee\Http\Middleware\IMiddleware */
foreach(static::$defaultMiddlewares as $middleware) {
$middleware = new $middleware();
if(!($middleware instanceof IMiddleware)) {
throw new RouterException('Middleware must be implement the IMiddleware interface.');
}
$middleware->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;
}
}
// Set default namespace
$defaultNamespace = '\\Demo\\Controllers';
protected static function loadExceptionHandler($class, $route, $e) {
$class = new $class();
parent::start($defaultNamespace);
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;
}
/**
+12 -8
View File
@@ -6,14 +6,18 @@
use Demo\Router;
Router::csrfVerifier(new \Demo\Middlewares\CsrfVerifier());
Router::defaultExceptionHandler('\Demo\Handlers\CustomExceptionHandler');
Router::get('/', 'DefaultController@index')->setAlias('home');
Router::get('/contact', 'DefaultController@contact')->setAlias('contact');
Router::basic('/companies', 'DefaultController@companies')->setAlias('companies');
Router::basic('/companies/{id}', 'DefaultController@companies')->setAlias('companies');
Router::group(['exceptionHandler' => 'Demo\Handlers\CustomExceptionHandler'], function() {
Router::get('/', 'DefaultController@index')->setAlias('home');
Router::get('/contact', 'DefaultController@contact')->setAlias('contact');
Router::get('/404', 'DefaultController@notFound')->setAlias('404');
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');
});
// Api
Router::group(['prefix' => '/api', 'middleware' => 'Demo\Middlewares\ApiVerification'], function() {
Router::resource('/demo', 'ApiController');
});