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 {