ユーザ登録時や退会時にメールで連絡するようにしているのですが、それぞれの処理内に「Yiiでメール周りの設定をする」で書いたようなスクリプトを書くのは見通しが悪そうなので、メール配送部分はイベント経由で行うことにしました。
手順としては
- イベントクラスを作成する
- イベントを定義する
- ハンドラを作成する
- イベントを組み込む
という感じです。
イベントクラスを作成する
ユーザ登録時のイベントクラスとしてUserAddEventクラスを protected/components/UserAddEvent.phpに作成します。
<?php class UserAddEvent extends CModelEvent { public $user; }
イベントを定義する
ユーザ登録時に利用しているUserモデル内のaddUser関数にイベントに関する処理を追加します。
public function addUser() { //ユーザ登録に関する処理があります。 //UserAddEventクラスのインスタンスを作成 $event=new UserAddEvent($this); $event->user=$this; //トリガ $this->onUserAdd($event); return $event->isValid; } //onUserAddイベントの定義 public function onUserAdd($event) { $this->raiseEvent('onUserAdd',$event); }
ハンドラを作成する
ハンドラとしてNotifierクラスをprotected/components/Notifier.phpに用意します。
<?php class Notifier { private function sendMail($to,$view,$vars=array(),$subject=null,$replyto=null,$cc=null,$from=null,$fromname=null,$layout=null) { $charset='iso-2022-jp'; $encoding='7bit'; mb_language('Japanese'); mb_internal_encoding('UTF-8'); $layout=empty($layout) ? 'main' : $layout; $from=empty($from) ? Yii::app()->params['adminEmail'] : $from; $fromname=empty($fromname) ? Yii::app()->params['adminName'] : $fromname; $replyto=empty($replyto) ? $from : $replyto; $mailer = Yii::createComponent('application.extensions.mailer.EMailer'); $mailer->CharSet = $charset; $mailer->Encoding = $encoding; $mailer->addAddress($to); if(!empty($cc)) $mailer->addCC($cc); $mailer->From=$from; $fromname=mb_convert_encoding($fromname,$charset,mb_internal_encoding()); $mailer->FromName=mb_encode_mimeheader($fromname); $mailer->addReplyTo($replyto); $request=Yii::app()->getRequest(); $vars=array_merge($vars,array( 'sitename'=>Yii::app()->name, 'siteurl'=>Yii::app()->createAbsoluteUrl('/'), 'ip'=>$request->getUserHostAddress(), 'ua'=>$request->getUserAgent(), 'refer'=>$request->getUrlReferrer(), )); $mailer->getView($view,$vars,$layout); $subject=empty($subject) ? $mailer->Subject : $subject; $subject=mb_convert_encoding($subject,$charset,mb_internal_encoding()); $mailer->Subject=mb_encode_mimeheader($subject); $mailer->Body=mb_convert_encoding($mailer->Body,$charset,mb_internal_encoding()); $mailer->send(); } public function userAdd($event) { $this->sendMail($event->user->email, 'userAdd', array( 'email'=>$event->user->email, )); } }
sendMail関数は、「Yiiでメール周りの設定をする」のメール配信部分を少し修正したものです。
userAdd関数がonUserAddの際に呼び出されるハンドラです。
イベントを組み込む
ユーザ登録を処理しているUserコントローラのcreateアクションにイベントの設定を行います。
public function actionCreate() { $model=new User('create'); if(isset($_POST['User'])) { $model->attributes=$_POST['User']; if($model->validate()) { //ハンドラを設定する $notifier=new Notifier(); $model->onUserAdd=array($notifier, 'userAdd'); $model->addUser(); Yii::app()->user->setFlash('success','登録完了。'); $this->refresh(); } } $this->render('create',array( 'model'=>$model, )); }
以上で、ユーザ登録あった際は、ユーザに登録完了メールが配送されるようになります。
1件のコメント
コメントは受け付けていません。