Commit c0316a10 by Mark

added mail events before/after send

parent 3577b5c9
...@@ -11,6 +11,9 @@ namespace yii\base; ...@@ -11,6 +11,9 @@ namespace yii\base;
* ActionEvent represents the event parameter used for an action event. * ActionEvent represents the event parameter used for an action event.
* *
* By setting the [[isValid]] property, one may control whether to continue running the action. * 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 <qiang.xue@gmail.com> * @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0 * @since 2.0
...@@ -25,12 +28,6 @@ class ActionEvent extends Event ...@@ -25,12 +28,6 @@ class ActionEvent extends Event
* @var mixed the action result. Event handlers may modify this property to change the action result. * @var mixed the action result. Event handlers may modify this property to change the action result.
*/ */
public $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. * Constructor.
......
...@@ -46,6 +46,11 @@ class Event extends Object ...@@ -46,6 +46,11 @@ class Event extends Object
*/ */
public $data; public $data;
/**
* @var boolean whether to continue execution of process or not.
*/
public $isValid = true;
private static $_events = []; private static $_events = [];
/** /**
......
<?php
/**
* @link http://www.yiiframework.com/
* @copyright Copyright (c) 2008 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
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.
*
* @author Mark Jebri <mark.github@yandex.ru>
* @since 2.0
*/
class MailEvent extends Event
{
/**
* @var \yii\mail\MessageInterface mail message being send
*/
public $message;
/**
*
*/
public $isSuccessful;
}
...@@ -11,15 +11,11 @@ namespace yii\base; ...@@ -11,15 +11,11 @@ namespace yii\base;
* ModelEvent class. * ModelEvent class.
* *
* ModelEvent represents the parameter needed by model events. * 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 <qiang.xue@gmail.com> * @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0 * @since 2.0
*/ */
class ModelEvent extends Event 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;
} }
...@@ -10,6 +10,11 @@ namespace yii\base; ...@@ -10,6 +10,11 @@ namespace yii\base;
/** /**
* ViewEvent represents events triggered by the [[View]] component. * 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 <qiang.xue@gmail.com> * @author Qiang Xue <qiang.xue@gmail.com>
* @since 2.0 * @since 2.0
*/ */
...@@ -26,12 +31,6 @@ class ViewEvent extends Event ...@@ -26,12 +31,6 @@ class ViewEvent extends Event
* @var string the view file path that is being rendered by [[View::renderFile()]]. * @var string the view file path that is being rendered by [[View::renderFile()]].
*/ */
public $viewFile; 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. * Constructor.
......
...@@ -12,6 +12,7 @@ use yii\base\Component; ...@@ -12,6 +12,7 @@ use yii\base\Component;
use yii\base\InvalidConfigException; use yii\base\InvalidConfigException;
use yii\base\ViewContextInterface; use yii\base\ViewContextInterface;
use yii\web\View; use yii\web\View;
use yii\base\MailEvent;
/** /**
* BaseMailer serves as a base class that implements the basic functions required by [[MailerInterface]]. * BaseMailer serves as a base class that implements the basic functions required by [[MailerInterface]].
...@@ -28,6 +29,16 @@ use yii\web\View; ...@@ -28,6 +29,16 @@ use yii\web\View;
*/ */
abstract class BaseMailer extends Component implements MailerInterface, ViewContextInterface 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. * @var string directory containing view files for this email messages.
* This can be specified as an absolute path or path alias. * This can be specified as an absolute path or path alias.
...@@ -206,6 +217,10 @@ abstract class BaseMailer extends Component implements MailerInterface, ViewCont ...@@ -206,6 +217,10 @@ abstract class BaseMailer extends Component implements MailerInterface, ViewCont
*/ */
public function send($message) public function send($message)
{ {
if (!$this->beforeSend($message)) {
return false;
}
$address = $message->getTo(); $address = $message->getTo();
if (is_array($address)) { if (is_array($address)) {
$address = implode(', ', array_keys($address)); $address = implode(', ', array_keys($address));
...@@ -213,10 +228,12 @@ abstract class BaseMailer extends Component implements MailerInterface, ViewCont ...@@ -213,10 +228,12 @@ abstract class BaseMailer extends Component implements MailerInterface, ViewCont
Yii::info('Sending email "' . $message->getSubject() . '" to "' . $address . '"', __METHOD__); Yii::info('Sending email "' . $message->getSubject() . '" to "' . $address . '"', __METHOD__);
if ($this->useFileTransport) { if ($this->useFileTransport) {
return $this->saveMessage($message); $isSuccessful = $this->saveMessage($message);
} else { } 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 ...@@ -297,4 +314,31 @@ abstract class BaseMailer extends Component implements MailerInterface, ViewCont
{ {
return Yii::getAlias($this->viewPath) . DIRECTORY_SEPARATOR . $view; 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);
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment