From a578938df79f94c19029752a8f1a86167496ee81 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Wed, 24 Apr 2013 18:59:54 -0400 Subject: [PATCH] Added beforeAction and afterAction to Module. --- framework/base/Controller.php | 22 ++++++++++++++-------- framework/base/Module.php | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/framework/base/Controller.php b/framework/base/Controller.php index d11d19b..0d46235 100644 --- a/framework/base/Controller.php +++ b/framework/base/Controller.php @@ -19,7 +19,14 @@ use yii\helpers\StringHelper; */ class Controller extends Component { + /** + * @event ActionEvent an event raised right before executing a controller action. + * You may set [[ActionEvent::isValid]] to be false to cancel the action execution. + */ const EVENT_BEFORE_ACTION = 'beforeAction'; + /** + * @event ActionEvent an event raised right after executing a controller action. + */ const EVENT_AFTER_ACTION = 'afterAction'; /** @@ -105,16 +112,15 @@ class Controller extends Component if ($action !== null) { $oldAction = $this->action; $this->action = $action; - - if ($this->beforeAction($action)) { - $status = $action->runWithParams($params); - $this->afterAction($action); - } else { - $status = 1; + $status = 1; + if ($this->module->beforeAction($action)) { + if ($this->beforeAction($action)) { + $status = $action->runWithParams($params); + $this->afterAction($action); + } + $this->module->afterAction($action); } - $this->action = $oldAction; - return $status; } else { throw new InvalidRouteException('Unable to resolve the request: ' . $this->getUniqueId() . '/' . $id); diff --git a/framework/base/Module.php b/framework/base/Module.php index d99778d..959bb04 100644 --- a/framework/base/Module.php +++ b/framework/base/Module.php @@ -9,7 +9,6 @@ namespace yii\base; use Yii; use yii\helpers\StringHelper; -use yii\helpers\FileHelper; /** * Module is the base class for module and application classes. @@ -39,6 +38,15 @@ use yii\helpers\FileHelper; abstract class Module extends Component { /** + * @event ActionEvent an event raised before executing a controller action. + * You may set [[ActionEvent::isValid]] to be false to cancel the action execution. + */ + const EVENT_BEFORE_ACTION = 'beforeAction'; + /** + * @event ActionEvent an event raised after executing a controller action. + */ + const EVENT_AFTER_ACTION = 'afterAction'; + /** * @var array custom module parameters (name => value). */ public $params = array(); @@ -613,4 +621,27 @@ abstract class Module extends Component return isset($controller) ? array($controller, $route) : false; } + + /** + * This method is invoked right before an action is to be executed (after all possible filters.) + * You may override this method to do last-minute preparation for the action. + * @param Action $action the action to be executed. + * @return boolean whether the action should continue to be executed. + */ + public function beforeAction($action) + { + $event = new ActionEvent($action); + $this->trigger(self::EVENT_BEFORE_ACTION, $event); + return $event->isValid; + } + + /** + * This method is invoked right after an action is executed. + * You may override this method to do some postprocessing for the action. + * @param Action $action the action just executed. + */ + public function afterAction($action) + { + $this->trigger(self::EVENT_AFTER_ACTION, new ActionEvent($action)); + } }