Yiiでメール周りの設定をする。その2

ユーザ登録時や退会時にメールで連絡するようにしているのですが、それぞれの処理内に「Yiiでメール周りの設定をする」で書いたようなスクリプトを書くのは見通しが悪そうなので、メール配送部分はイベント経由で行うことにしました。

手順としては

  1. イベントクラスを作成する
  2. イベントを定義する
  3. ハンドラを作成する
  4. イベントを組み込む

という感じです。

イベントクラスを作成する

ユーザ登録時のイベントクラスとして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,
  ));
}

以上で、ユーザ登録あった際は、ユーザに登録完了メールが配送されるようになります。

投稿日:
カテゴリー: php タグ:

1件のコメント

コメントは受け付けていません。