diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 365744e..6383a15 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -3,7 +3,12 @@ - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -62,8 +37,38 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -71,8 +76,11 @@ - - + + + + + @@ -80,17 +88,8 @@ - - - - - - - - - - - + + @@ -98,8 +97,8 @@ - - + + @@ -107,11 +106,26 @@ - - + + - - + + + + + + + + + + + + + + + + + @@ -120,12 +134,6 @@ - # Advan - # Feed - call_user_func_array - loadClass - $this-> - $this->result $this->r getInput input()->get @@ -150,6 +158,12 @@ set hasParam csrf_token + static function start + fireEvents( + EVENT_LOAD + ->setUrl + setUrl + addRoute D:\Workspace\simple-php-router\src\Pecee\SimpleRouter\Route @@ -184,18 +198,14 @@ @@ -385,7 +399,7 @@ - + @@ -423,7 +437,10 @@ - + + + + @@ -439,9 +456,11 @@ + + @@ -519,44 +538,45 @@ - + + - + - + - + - + - + - + - + - - + + - - + + - - + + - @@ -574,26 +594,26 @@ - + - - + + - + - - - - - - + + + + + + @@ -608,27 +628,6 @@ - - - - - - - - - - - - - - - - - - - - - @@ -717,13 +716,6 @@ - - - - - - - @@ -731,13 +723,6 @@ - - - - - - - @@ -882,31 +867,31 @@ - + - - + + - + - - + + - + - - + + - - + + @@ -916,41 +901,88 @@ - - + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - + + + + + - + - - + + + + + + + + + + + + diff --git a/README.md b/README.md index 16aa41c..7d35382 100644 --- a/README.md +++ b/README.md @@ -1296,6 +1296,7 @@ All event callbacks will retrieve a `EventArgument` object as parameter. This ob | `EVENT_ALL` | - | Fires when a event is triggered. | | `EVENT_INIT` | - | Fires when router is initializing and before routes are loaded. | | `EVENT_LOAD` | `loadedRoutes` | Fires when all routes has been loaded and rendered, just before the output is returned. | +| `EVENT_ADD_ROUTE` | `route` | Fires when route is added to the router. | | `EVENT_REWRITE` | `rewriteUrl`
`rewriteRoute` | Fires when a url-rewrite is and just before the routes are re-initialized. | | `EVENT_BOOT` | `bootmanagers` | Fires when the router is booting. This happens just before boot-managers are rendered and before any routes has been loaded. | | `EVENT_RENDER_BOOTMANAGER` | `bootmanagers`
`bootmanager` | Fires before a boot-manager is rendered. | diff --git a/src/Pecee/SimpleRouter/Handlers/EventHandler.php b/src/Pecee/SimpleRouter/Handlers/EventHandler.php index d3ba142..9ac42ec 100644 --- a/src/Pecee/SimpleRouter/Handlers/EventHandler.php +++ b/src/Pecee/SimpleRouter/Handlers/EventHandler.php @@ -22,6 +22,11 @@ class EventHandler implements IEventHandler */ public const EVENT_LOAD = 'onLoad'; + /** + * Fires when route is added to the router + */ + public const EVENT_ADD_ROUTE = 'onAddRoute'; + /** * Fires when a url-rewrite is and just before the routes are re-initialized. */ @@ -95,6 +100,7 @@ class EventHandler implements IEventHandler self::EVENT_ALL, self::EVENT_INIT, self::EVENT_LOAD, + self::EVENT_ADD_ROUTE, self::EVENT_REWRITE, self::EVENT_BOOT, self::EVENT_RENDER_BOOTMANAGER, diff --git a/src/Pecee/SimpleRouter/Route/ILoadableRoute.php b/src/Pecee/SimpleRouter/Route/ILoadableRoute.php index 68cbbef..d0d7090 100644 --- a/src/Pecee/SimpleRouter/Route/ILoadableRoute.php +++ b/src/Pecee/SimpleRouter/Route/ILoadableRoute.php @@ -39,6 +39,13 @@ interface ILoadableRoute extends IRoute */ public function setUrl(string $url): self; + /** + * Prepend url + * @param string $url + * @return ILoadableRoute + */ + public function prependUrl(string $url): self; + /** * Returns the provided name for the router. * diff --git a/src/Pecee/SimpleRouter/Route/LoadableRoute.php b/src/Pecee/SimpleRouter/Route/LoadableRoute.php index a719af7..02f88df 100644 --- a/src/Pecee/SimpleRouter/Route/LoadableRoute.php +++ b/src/Pecee/SimpleRouter/Route/LoadableRoute.php @@ -85,6 +85,17 @@ abstract class LoadableRoute extends Route implements ILoadableRoute return $this; } + /** + * Prepend url + * + * @param string $url + * @return ILoadableRoute + */ + public function prependUrl(string $url): ILoadableRoute + { + return $this->setUrl(rtrim($url, '/') . $this->url); + } + public function getUrl(): string { return $this->url; @@ -240,7 +251,7 @@ abstract class LoadableRoute extends Route implements ILoadableRoute } if (isset($values['prefix']) === true) { - $this->setUrl($values['prefix'] . $this->getUrl()); + $this->prependUrl($values['prefix']); } parent::setSettings($values, $merge); diff --git a/src/Pecee/SimpleRouter/Router.php b/src/Pecee/SimpleRouter/Router.php index 28ad270..50acc48 100644 --- a/src/Pecee/SimpleRouter/Router.php +++ b/src/Pecee/SimpleRouter/Router.php @@ -151,18 +151,20 @@ class Router */ public function addRoute(IRoute $route): IRoute { + $this->fireEvents(EventHandler::EVENT_ADD_ROUTE, [ + 'route' => $route, + ]); + /* * If a route is currently being processed, that means that the route being added are rendered from the parent * routes callback, so we add them to the stack instead. */ if ($this->isProcessingRoute === true) { $this->routeStack[] = $route; - - return $route; + } else { + $this->routes[] = $route; } - $this->routes[] = $route; - return $route; } diff --git a/tests/Pecee/SimpleRouter/EventHandlerTest.php b/tests/Pecee/SimpleRouter/EventHandlerTest.php index 2447c9f..8fa873d 100644 --- a/tests/Pecee/SimpleRouter/EventHandlerTest.php +++ b/tests/Pecee/SimpleRouter/EventHandlerTest.php @@ -6,8 +6,8 @@ require_once 'Dummy/Handler/ExceptionHandler.php'; require_once 'Dummy/Security/SilentTokenProvider.php'; require_once 'Dummy/Managers/TestBootManager.php'; -use \Pecee\SimpleRouter\Handlers\EventHandler; -use \Pecee\SimpleRouter\Event\EventArgument; +use Pecee\SimpleRouter\Event\EventArgument; +use Pecee\SimpleRouter\Handlers\EventHandler; class EventHandlerTest extends \PHPUnit\Framework\TestCase { @@ -78,4 +78,30 @@ class EventHandlerTest extends \PHPUnit\Framework\TestCase $this->assertEquals(true, $status); } + public function testPrefixEvent() + { + + $eventHandler = new EventHandler(); + $eventHandler->register(EventHandler::EVENT_ADD_ROUTE, function (EventArgument $arg) use (&$status) { + + if ($arg->route instanceof \Pecee\SimpleRouter\Route\LoadableRoute) { + $arg->route->prependUrl('/local-path'); + } + + }); + + TestRouter::addEventHandler($eventHandler); + + $status = false; + + TestRouter::get('/', function () use (&$status) { + $status = true; + }); + + TestRouter::debug('/local-path'); + + $this->assertTrue($status); + + } + } \ No newline at end of file