diff --git a/README.md b/README.md index f4321ae..de96516 100644 --- a/README.md +++ b/README.md @@ -84,6 +84,7 @@ composer require nicollassilva/minasrouter - [Route Redirect](https://github.com/nicollassilva/minasrouter#route-redirect) - [Route with Individual Middleware in Group](https://github.com/nicollassilva/minasrouter#route-with-individual-middleware-in-group) - [Route with Different Name in Group](https://github.com/nicollassilva/minasrouter#route-with-different-name-in-group) +- [Fallback Routes](https://github.com/nicollassilva/minasrouter#fallback-routes) ### 3. Request Route - [Introduction](https://github.com/nicollassilva/minasrouter#request-route) @@ -455,6 +456,18 @@ Route::permanentRedirect("/here", "/there"); // You can return an existing route Route::redirect("/index", "web.index"); ``` + +### Fallback Routes + +The fallback route is responsible when there is no route registered with that url address. Whenever there is no route that was requested by the user, the fallback route will be called. + +```php +Route::fallback(function() { + echo 'Route error!'; + // ... +}); +``` + > OBS: Tenha cuidado caso queira redirecionar para uma rota existente, se nela conter argumentos dinâmicos, ela retornará todo o regex e irá causar erro. Be careful you redirect to an existing route, because if it has dynamic arguments, it will return the entire regex and error returned. diff --git a/src/Router/Route.php b/src/Router/Route.php index 81d7eca..bad6e13 100644 --- a/src/Router/Route.php +++ b/src/Router/Route.php @@ -51,7 +51,7 @@ public static function get(String $uri, $callback) /** * @param string $uri - * @param \Closure|array $callback + * @param \Closure|array|string $callback * * @return \MinasRouter\Router\RouteManager */ @@ -62,7 +62,7 @@ public static function post(String $uri, $callback) /** * @param string $uri - * @param \Closure|array $callback + * @param \Closure|array|string $callback * * @return \MinasRouter\Router\RouteManager */ @@ -73,7 +73,7 @@ public static function put(String $uri, $callback) /** * @param string $uri - * @param \Closure|array $callback + * @param \Closure|array|string $callback * * @return \MinasRouter\Router\RouteManager */ @@ -84,7 +84,7 @@ public static function patch(String $uri, $callback) /** * @param string $uri - * @param \Closure|array $callback + * @param \Closure|array|string $callback * * @return \MinasRouter\Router\RouteManager */ @@ -106,7 +106,8 @@ public static function any(String $uri, $callback) /** * @param string $uri - * @param \Closure|array $callback + * @param string $redirect + * @param int $httpCode * * @return \MinasRouter\Router\RouteManager */ @@ -117,7 +118,7 @@ public static function redirect(String $uri, String $redirect, Int $httpCode = 3 /** * @param string $uri - * @param \Closure|array $callback + * @param string $redirect * * @return \MinasRouter\Router\RouteManager */ @@ -132,7 +133,7 @@ public static function permanentRedirect(String $uri, String $redirect) * * @return \MinasRouter\Router\RouteManager */ - public static function match(array $methods, String $uri, $callback) + public static function match(Array $methods, String $uri, $callback) { return self::$collection->addMultipleHttpRoutes($uri, $callback, $methods); } @@ -157,4 +158,14 @@ public static function execute() { self::$collection->run(); } + + /** + * @param \Closure|array|string + * + * @return void + */ + public static function fallback($callback) + { + self::$collection->addRoute("GET", "/404", $callback)->name('fallback'); + } } diff --git a/src/Router/RouteCollection.php b/src/Router/RouteCollection.php index cde49e8..c74f608 100644 --- a/src/Router/RouteCollection.php +++ b/src/Router/RouteCollection.php @@ -322,6 +322,10 @@ protected function resolveRouterUri(String $uri): String protected function dispatchRoute(): ?\Closure { if (!$route = $this->currentRoute) { + if($fallbackRoute = $this->getByName('fallback')) { + return $this->executeRoute($fallbackRoute); + } + $this->setHttpCode($this->httpCodes["notFound"]); $this->throwException( @@ -361,6 +365,18 @@ protected function dispatchRoute(): ?\Closure return null; } + /** + * Responsible for execute the route + * + * @param RouteManager $route + * + * @return mixed|false + */ + protected function executeRoute(RouteManager $route) + { + return call_user_func($route->getAction(), ...$route->closureReturn()); + } + /** * Method responsible for checking if the controller * class exists and returns an instance of it. @@ -387,7 +403,7 @@ protected function resolveRouteController(String $controller) * Method responsible for executing * the middlewares of the current route. * - * @return void + * @return mixed|false|void */ protected function executeMiddlewares(RouteManager $route) {