diff --git a/framework/yii/base/ActionEvent.php b/framework/yii/base/ActionEvent.php index 6e123a0..adfeddc 100644 --- a/framework/yii/base/ActionEvent.php +++ b/framework/yii/base/ActionEvent.php @@ -11,7 +11,10 @@ namespace yii\base; * ActionEvent represents the event parameter used for an action event. * * By setting the [[isValid]] property, one may control whether to continue running the action. - * + * @property boolean $isValid Event handlers of + * [[Controller::EVENT_BEFORE_ACTION]] may set this property to decide whether + * to continue running the current action. + * * @author Qiang Xue * @since 2.0 */ @@ -25,12 +28,6 @@ class ActionEvent extends Event * @var mixed the action result. Event handlers may modify this property to change the action result. */ public $result; - /** - * @var boolean whether to continue running the action. Event handlers of - * [[Controller::EVENT_BEFORE_ACTION]] may set this property to decide whether - * to continue running the current action. - */ - public $isValid = true; /** * Constructor. diff --git a/framework/yii/base/Event.php b/framework/yii/base/Event.php index 974a1a4..4c8ffcb 100644 --- a/framework/yii/base/Event.php +++ b/framework/yii/base/Event.php @@ -46,6 +46,11 @@ class Event extends Object */ public $data; + /** + * @var boolean whether to continue execution of process or not. + */ + public $isValid = true; + private static $_events = []; /** diff --git a/framework/yii/base/MailEvent.php b/framework/yii/base/MailEvent.php new file mode 100644 index 0000000..188c7d3 --- /dev/null +++ b/framework/yii/base/MailEvent.php @@ -0,0 +1,30 @@ + + * @since 2.0 + */ + +class MailEvent extends Event +{ + + /** + * @var \yii\mail\MessageInterface mail message being send + */ + public $message; + /** + * + */ + public $isSuccessful; +} diff --git a/framework/yii/base/ModelEvent.php b/framework/yii/base/ModelEvent.php index 57e41f9..b4b602d 100644 --- a/framework/yii/base/ModelEvent.php +++ b/framework/yii/base/ModelEvent.php @@ -11,15 +11,11 @@ namespace yii\base; * ModelEvent class. * * ModelEvent represents the parameter needed by model events. - * + * @property boolean $isValid A model is in valid status if it passes validations or certain checks. + * * @author Qiang Xue * @since 2.0 */ class ModelEvent extends Event { - /** - * @var boolean whether the model is in valid status. Defaults to true. - * A model is in valid status if it passes validations or certain checks. - */ - public $isValid = true; } diff --git a/framework/yii/base/ViewEvent.php b/framework/yii/base/ViewEvent.php index d02e180..70ba96d 100644 --- a/framework/yii/base/ViewEvent.php +++ b/framework/yii/base/ViewEvent.php @@ -10,6 +10,11 @@ namespace yii\base; /** * ViewEvent represents events triggered by the [[View]] component. * + * @property boolean $isValid whether to continue rendering the view file. Event handlers of + *[[View::EVENT_BEFORE_RENDER]] may set this property to decide whether + * to continue rendering the current view file. + * + * * @author Qiang Xue * @since 2.0 */ @@ -26,12 +31,6 @@ class ViewEvent extends Event * @var string the view file path that is being rendered by [[View::renderFile()]]. */ public $viewFile; - /** - * @var boolean whether to continue rendering the view file. Event handlers of - * [[View::EVENT_BEFORE_RENDER]] may set this property to decide whether - * to continue rendering the current view file. - */ - public $isValid = true; /** * Constructor. diff --git a/framework/yii/mail/BaseMailer.php b/framework/yii/mail/BaseMailer.php index 90565c9..1ed0071 100644 --- a/framework/yii/mail/BaseMailer.php +++ b/framework/yii/mail/BaseMailer.php @@ -12,6 +12,7 @@ use yii\base\Component; use yii\base\InvalidConfigException; use yii\base\ViewContextInterface; use yii\web\View; +use yii\base\MailEvent; /** * BaseMailer serves as a base class that implements the basic functions required by [[MailerInterface]]. @@ -28,6 +29,16 @@ use yii\web\View; */ abstract class BaseMailer extends Component implements MailerInterface, ViewContextInterface { + + /** + * @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_SEND = 'beforeSend'; + /** + * @event ActionEvent an event raised right after executing a controller action. + */ + const EVENT_AFTER_SEND = 'afterSend'; /** * @var string directory containing view files for this email messages. * This can be specified as an absolute path or path alias. @@ -206,6 +217,10 @@ abstract class BaseMailer extends Component implements MailerInterface, ViewCont */ public function send($message) { + if (!$this->beforeSend($message)) { + return false; + } + $address = $message->getTo(); if (is_array($address)) { $address = implode(', ', array_keys($address)); @@ -213,10 +228,12 @@ abstract class BaseMailer extends Component implements MailerInterface, ViewCont Yii::info('Sending email "' . $message->getSubject() . '" to "' . $address . '"', __METHOD__); if ($this->useFileTransport) { - return $this->saveMessage($message); + $isSuccessful = $this->saveMessage($message); } else { - return $this->sendMessage($message); + $isSuccessful = $this->sendMessage($message); } + $this->afterSend($message, $isSuccessful); + return $isSuccessful; } /** @@ -297,4 +314,31 @@ abstract class BaseMailer extends Component implements MailerInterface, ViewCont { return Yii::getAlias($this->viewPath) . DIRECTORY_SEPARATOR . $view; } + + /** + * This method is invoked right before mail send. + * You may override this method to do last-minute preparation for the message. + * If you override this method, please make sure you call the parent implementation first. + * @param MessageInterface $message + */ + public function beforeSend($message) + { + $event = new MailEvent(['message' => $message]); + $this->trigger(self::EVENT_BEFORE_SEND, $event); + return $event->isValid; + } + + /** + * This method is invoked right after mail was send. + * You may override this method to do some postprocessing or logging based on mail send status. + * If you override this method, please make sure you call the parent implementation first. + * @param MessageInterface $message + * @param boolean $isSuccessful + */ + public function afterSend($message, $isSuccessful) + { + $event = new MailEvent(['message' => $message, 'isSuccessful' => $isSuccessful]); + $this->trigger(self::EVENT_AFTER_SEND, $event); + } + }