diff --git a/README.md b/README.md index a601d9c..32120cd 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,37 @@ SimpleRouter::group(['prefix' => 'v1', 'middleware' => '\MyWebsite\Middleware\So }); ``` +#### ExceptionHandler example + +This is a basic example of an ExceptionHandler implementation: + +```php +namespace BB\Handlers; + +use Pecee\Http\Request; +use Pecee\SimpleRouter\RouterEntry; + +class CustomExceptionHandler implements IExceptionHandler { + + public function handleError( Request $request, RouterEntry $router = null, \Exception $error) { + + // If the error-code is 404; show another route which contains the page-not-found + if($error->getCode() === 404) { + // Load your custom 404-page view + } + + // Output error as json if on api path. + if(stripos($request->getUri(), '/api') !== false) { + response()->json(['error' => $error->getMessage()]); + } + + // Otherwise default exception will be thrown by the router. + + } + +} +`` + ### Sub-domain routing Route groups may also be used to route wildcard sub-domains. Sub-domains may be assigned route parameters just like route URIs, allowing you to capture a portion of the sub-domain for usage in your route or controller. The sub-domain may be specified using the ```domain``` key on the group attribute array: diff --git a/src/Pecee/Http/Input/Input.php b/src/Pecee/Http/Input/Input.php index e0fafaa..acf8d92 100644 --- a/src/Pecee/Http/Input/Input.php +++ b/src/Pecee/Http/Input/Input.php @@ -1,6 +1,8 @@ getMethod() !== 'get') { + if(Request::getInstance()->getMethod() !== 'get') { $element = $this->post->findFirst($index); diff --git a/src/Pecee/SimpleRouter/RouterBase.php b/src/Pecee/SimpleRouter/RouterBase.php index f88be22..b4c9471 100644 --- a/src/Pecee/SimpleRouter/RouterBase.php +++ b/src/Pecee/SimpleRouter/RouterBase.php @@ -20,6 +20,7 @@ class RouterBase { protected $bootManagers; protected $baseCsrfVerifier; protected $middlewaresToLoad; + protected $exceptionHandlers; // TODO: clean up - cut some of the methods down to smaller pieces @@ -30,6 +31,7 @@ class RouterBase { $this->controllerUrlMap = array(); $this->bootManagers = array(); $this->middlewaresToLoad = array(); + $this->exceptionHandlers = array(); } public function addRoute(RouterEntry $route) { @@ -91,6 +93,9 @@ class RouterBase { // Load middleware on group if route matches if($route->getPrefix() !== null && $route->matchRoute($this->request)) { + if($route->getExceptionHandler() !== null) { + $this->exceptionHandlers[] = $route->getExceptionHandler(); + } $this->middlewaresToLoad[] = $route; } } @@ -186,14 +191,15 @@ class RouterBase { } if(!$this->request->loadedRoute) { - throw new RouterException(sprintf('Route not found: %s', $this->request->getUri()), 404); + $this->handleException(new RouterException(sprintf('Route not found: %s', $this->request->getUri()), 404)); } } protected function handleException(\Exception $e) { - if($this->request->loadedRoute !== null && $this->request->loadedRoute->exceptionHandler !== null) { - $handler = new $this->request->loadedRoute->exceptionHandler(); - if(!($handler instanceof IExceptionHandler)) { + + foreach ($this->exceptionHandlers as $handler) { + $handler = new $handler($this->request); + if (!($handler instanceof IExceptionHandler)) { throw new RouterException('Exception handler must implement the IExceptionHandler interface.'); }