From be414aa2cdb0e08864083d44767871a4522ca33a Mon Sep 17 00:00:00 2001 From: Abel Hoogeveen Date: Fri, 1 Mar 2019 11:07:24 +0100 Subject: [PATCH] Implemented RouterCallViewEvent This event gets called right before defaultCallable() invokes the requested method on the requested view. This allows other classes to intervene when required. Currently used by the WebComponent to suppress CSRF Exceptions. --- src/FuzeWorks/Event/RouterCallViewEvent.php | 101 ++++++++++++++++++++ src/FuzeWorks/Router.php | 28 +++++- 2 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 src/FuzeWorks/Event/RouterCallViewEvent.php diff --git a/src/FuzeWorks/Event/RouterCallViewEvent.php b/src/FuzeWorks/Event/RouterCallViewEvent.php new file mode 100644 index 0000000..47c1159 --- /dev/null +++ b/src/FuzeWorks/Event/RouterCallViewEvent.php @@ -0,0 +1,101 @@ + + * @copyright Copyright (c) 2013 - 2019, TechFuze. (http://techfuze.net) + */ +class RouterCallViewEvent extends Event +{ + /** + * The function that will be loaded in the view + * + * @var string + */ + public $viewMethod; + + /** + * The parameters that will be provided to the function in the view + * + * @var string + */ + public $viewParameters; + + /** + * The route that resulted in this controller and view + * + * @var string + */ + public $route; + + /** + * The view the method will be called on + * + * @var View + */ + public $view; + + /** + * The controller that's associated with this View + * + * @var Controller + */ + public $controller; + + public function init(View $view, Controller $controller, string $viewMethod, string $viewParameters, string $route) + { + $this->view = $view; + $this->controller = $controller; + $this->viewMethod = $viewMethod; + $this->viewParameters = $viewParameters; + $this->route = $route; + } +} \ No newline at end of file diff --git a/src/FuzeWorks/Router.php b/src/FuzeWorks/Router.php index 0ac6b26..9ea7761 100644 --- a/src/FuzeWorks/Router.php +++ b/src/FuzeWorks/Router.php @@ -36,6 +36,7 @@ namespace FuzeWorks; +use FuzeWorks\Event\RouterCallViewEvent; use FuzeWorks\Event\RouterLoadCallableEvent; use FuzeWorks\Event\RouterLoadViewAndControllerEvent; use FuzeWorks\Exception\ConfigException; @@ -339,6 +340,28 @@ class Router return false; } + // Fire routerCallViewEvent + try { + /** @var RouterCallViewEvent $event */ + $event = Events::fireEvent('routerCallViewEvent', + $this->view, + $this->controller, + $event->viewMethod, + $event->viewParameters, + $event->route + ); + + // Reset vars + $this->view = $event->view; + $this->controller = $event->controller; + } catch (EventException $e) { + throw new RouterException("Could not load view. routerCallViewEvent threw exception: '".$e->getMessage()."'"); + } + + // Cancel if requested to do so + if ($event->isCancelled()) + throw new HaltException("Will not load view. Cancelled by routerCallViewEvent"); + // If the view does not want a function to be loaded, provide a halt parameter if (isset($this->view->halt)) throw new HaltException("Will not load view. Cancelled by 'halt' attribute in view."); @@ -347,7 +370,10 @@ class Router if (method_exists($this->view, $event->viewMethod) || method_exists($this->view, '__call')) { // Execute the function on the view - return $this->view->{$event->viewMethod}($event->viewParameters); + Logger::newLevel("Calling method '{$event->viewMethod}' on " . get_class($this->view) . ' with ' . get_class($this->controller)); + $output = $this->view->{$event->viewMethod}($event->viewParameters); + Logger::stopLevel(); + return $output; } else {