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 @@
-
+
+
+
+
+
+
@@ -17,42 +22,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 @@
-
-
-
-
@@ -215,13 +225,17 @@
-
-
-
+
+
+
+
+
+
+
@@ -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