QdmailをCakePHP2.xで使う方法 

@ojimacです。

前回に引き続きCakePHP2.xネタです。
バージョンは2.1 stableで確認しています。

CakePHPを使ったサービスを作る際は、メール送信用のライブラリとしてQdmailを使うのですが、
CakePHP2.xでQdmailを使おうとしたらそのままでは使えません。
※ ちなみに、CakePHP1.3でQdmailを使う場合でも修正が必要で、

CakePHP1.3でQdmailを使えるようにする

の対応済とします。

これは、ファイルの命名規則や、メールテンプレートのディレクトリ構造が
変わっているためで、CakePHP2の規約に合わせて修正が必要です。

修正箇所をまとめておきます。

0. qdmail.phpのファイル名を変更する

CakePHPでQdmailを使う際はコンポーネントとして使いますが、
CakePHP2から、コンポーネントのファイル名が、クラス名と同じになりました。

shell> mv qdmail.php QdmailComponent.php

のようにしておきます。

1. QdmailComponentメソッドを変更する

元のQdmailComponentメソッドは、

function QdmailComponent( $param = null ){
    if( !is_null($param)){
        $param = func_get_args();
    }
    parent::__construct( $param );
}

のようになっています。
CakePHP1.3系では、引数$paramにはnullが入ってきていたのですが、
CakePHP2ではComponentCollectionというオブジェクトが$paramに入ってきます。
そのため、継承元のクラスで引数がオブジェクトを前提としていない箇所でエラーになってしまいます。

そこで、

function QdmailComponent( $param = null ){
    $param = null;
    /*
    if( !is_null($param)){
        $param = func_get_args();
    }
    */
    parent::__construct( $param );
}

のようにして、$paramにはnullが入るようにしてしまいます。
※ もっと良い方法で解決している方がいたら教えて下さい><!

2. コンポーネントに必要なメソッドを追加

2. までの手順だとCakePHPのコンポーネントの公式ドキュメント内で、Component APIとして定義されている
- initialize
- beforeRender
- shutdown
の3メソッドで、

Warning (2): call_user_func_array() expects parameter 1 to be a valid callback, class 'QdmailComponent' does not have a method 'initialize' [CORE/Cake/Utility/ObjectCollection.php, line 130]

のようなWarningが起こります。これをWarningを消すには、

function initialize(){}
function beforeRender(){}
function shutdown(){}

の3メソッドをQdmailComponentクラスの中に追加します。
中身は空です。

3. QdmailComponent内のテンプレートのパスを設定しているプロパティを変更する

CakePHP2.xからメールテンプレートのデフォルト位置が、

テンプレート /path/to/cake/app/views/elements/email/text
レイアウト /path/to/cake/app/views/layouts/email/text

から

テンプレート /path/to/cake/app/View/Emails/text
レイアウト /path/to/cake/app/View/Layouts/Emails/text

に変わっています。

そこで、QdmailComponentのプロパティ

    var $view_dir   = 'email';
    var $layout_dir = 'email';
    var $view       = null;

    var $view_dir   = 'Emails';
    var $layout_dir = 'Emails';
    var $view       = 'View';

のように設定します。

4. テンプレート読込の箇所の修正

CakePHP1.3でQdmailを使えるようにする
で修正している箇所

$content = $view->element( $this->view_dir . DS . $type . DS . $this->template , array('content' => $content ) , true );

ですが、elementsディレクトリ配下からメールテンプレートが外れたことから、

$content = $view->element( '../' . $this->view_dir . DS . $type . DS . $this->template , array('content' => $content ) , true );

のようにして対応しました。

そうすると、CakePHP1.3の時までのように、

$this->Qdmail->to();
$this->Qdmail->subject();
$this->Qdmail->from();
$this->Qdmail->cakeText();
$this->Qdmail->send();

の手順でメールを送れるようになるかと思います。

CakePHP2.xからはCakeEmailというメール送信用のコアライブラリが出てきたので、
気になるところですが、実績重視ということで。。

5. おまけ qdsmtpもCakePHP2対応する

ファイル名をCakePHP2.xの規約になおすだけです!

mv qdsmtp.php QdsmtpComponent.php

<参考URL>
- CakePHP2公式ドキュメント

Comments are closed.