1919use Psr \Http \Message \ServerRequestInterface ;
2020use Psr \Http \Server \MiddlewareInterface ;
2121use Psr \Http \Server \RequestHandlerInterface ;
22+ use Sunrise \Http \Router \Event \RouteEvent ;
2223use Sunrise \Http \Router \Exception \InvalidArgumentException ;
2324use Sunrise \Http \Router \Exception \MethodNotAllowedException ;
2425use Sunrise \Http \Router \Exception \PageNotFoundException ;
2526use Sunrise \Http \Router \Exception \RouteNotFoundException ;
2627use Sunrise \Http \Router \Loader \LoaderInterface ;
2728use Sunrise \Http \Router \RequestHandler \CallableRequestHandler ;
2829use Sunrise \Http \Router \RequestHandler \QueueableRequestHandler ;
30+ use Symfony \Contracts \EventDispatcher \EventDispatcherInterface ;
2931
3032/**
3133 * Import functions
@@ -90,6 +92,15 @@ class Router implements MiddlewareInterface, RequestHandlerInterface, RequestMet
9092 */
9193 private $ matchedRoute = null ;
9294
95+ /**
96+ * The router's event dispatcher
97+ *
98+ * @var EventDispatcherInterface|null
99+ *
100+ * @since 2.13.0
101+ */
102+ private $ eventDispatcher = null ;
103+
93104 /**
94105 * Gets the router host table
95106 *
@@ -132,6 +143,18 @@ public function getMatchedRoute() : ?RouteInterface
132143 return $ this ->matchedRoute ;
133144 }
134145
146+ /**
147+ * Gets the router's event dispatcher
148+ *
149+ * @return EventDispatcherInterface|null
150+ *
151+ * @since 2.13.0
152+ */
153+ public function getEventDispatcher () : ?EventDispatcherInterface
154+ {
155+ return $ this ->eventDispatcher ;
156+ }
157+
135158 /**
136159 * Adds the given patterns to the router
137160 *
@@ -246,6 +269,20 @@ public function addMiddleware(MiddlewareInterface ...$middlewares) : void
246269 }
247270 }
248271
272+ /**
273+ * Sets the given event dispatcher to the router
274+ *
275+ * @param EventDispatcherInterface|null $eventDispatcher
276+ *
277+ * @return void
278+ *
279+ * @since 2.13.0
280+ */
281+ public function setEventDispatcher (?EventDispatcherInterface $ eventDispatcher ) : void
282+ {
283+ $ this ->eventDispatcher = $ eventDispatcher ;
284+ }
285+
249286 /**
250287 * Gets allowed methods
251288 *
@@ -374,6 +411,13 @@ public function run(ServerRequestInterface $request) : ResponseInterface
374411 $ routing = new CallableRequestHandler (function (ServerRequestInterface $ request ) : ResponseInterface {
375412 $ route = $ this ->match ($ request );
376413 $ this ->matchedRoute = $ route ;
414+
415+ if (isset ($ this ->eventDispatcher )) {
416+ $ event = new RouteEvent ($ route , $ request );
417+ $ this ->eventDispatcher ->dispatch ($ event , RouteEvent::NAME );
418+ $ request = $ event ->getRequest ();
419+ }
420+
377421 return $ route ->handle ($ request );
378422 });
379423
@@ -396,6 +440,12 @@ public function handle(ServerRequestInterface $request) : ResponseInterface
396440 $ route = $ this ->match ($ request );
397441 $ this ->matchedRoute = $ route ;
398442
443+ if (isset ($ this ->eventDispatcher )) {
444+ $ event = new RouteEvent ($ route , $ request );
445+ $ this ->eventDispatcher ->dispatch ($ event , RouteEvent::NAME );
446+ $ request = $ event ->getRequest ();
447+ }
448+
399449 $ middlewares = $ this ->getMiddlewares ();
400450 if (empty ($ middlewares )) {
401451 return $ route ->handle ($ request );
0 commit comments