事件可以将自定义代码“注入”到现有代码中的特定执行点。 附加自定义代码到某个事件,当这个事件被触发时,这些代码就会自动执行。
使用事件发送邮件步骤如下:
1、事件定义 和 绑定
事件绑定使用 yii\base\Component 的on方法,yii的controller控制器已经继承component,可以直接使用
如下代码:
class SiteController extends Controller
{
//定义事件
const SEND_MAIL = 'send_mail';
public function init()
{
parent::init();
//初始化绑定事件
$this->on(self::SEND_MAIL,['common\components\Mail','sendMail']);
}
以上代码定义了SEND_MAIL事件,并绑定了 common\components\Mail 类的 sendMail 静态方法,当触发该事件就会调用此方法。
2、事件触发
事件触发使用yii\base\Component 的 trigger 方法,
如下代码:
//邮件发送
public function actionSendMail()
{
$event = new MailEvent();
$event->email = '270077706@qq.com';
$event->subject = '测试邮件';
$event->content = '事件发送邮件内容';
$this->trigger(self::SEND_MAIL,$event);
}
如果不需要传参,只要最后一行就可以了,如果需要传参,那么参数必须是一个事件对象;
这里因为要传email的相关参数,所以需要创建一个 MailEvent 类,参考 3
3、事件传参
$event 作为 yii\base\Component::trigger() 方法的第二个参数。 这个事件对象必须是yii\base\Event 类或其子类的实例。 因此创建一个子类继承它:
代码如下:
<?php
/**
* 邮件事件类
*/
namespace common\components;
use yii\base\Event;
class MailEvent extends Event
{
public $email;
public $subject;
public $content;
}
有了MailEvent类,只需要定义需要的属性就可以了,需要使用的时候,给他的对象属性赋值,然后作为trigger方法的参数传递给Mail类。
4、邮件发送
最后使用common\components\Mail 类的 sendMail 静态方法,发送邮件,
代码如下:
<?php
/**
* 邮件发送类
*/
namespace common\components;
use Yii;
class Mail
{
public static function sendMail($event)
{
$mail= Yii::$app->mailer->compose();
$mail->setTo($event->email); //要发送给那个人的邮箱
$mail->setSubject($event->subject); //邮件主题
$mail->setTextBody($event->content); //发布纯文字文本
return $mail->send();
}
}
注意,这里的sendMail是静态方法;
附:邮件发送的配置,在 common\config\main.php['components'] 下
//邮件
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
'viewPath' => '@common/mail',
'useFileTransport' => false,
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'smtp.163.com',
'username' => '123456@163.com',
'password' => '123456', //这里是授权码非密码
'port' => '25',
'encryption' => 'tls',
],
'messageConfig'=>[
'charset'=>'UTF-8',
'from'=>['123456@163.com'=>'Blog站点']
],
],