Apelog

Zend_MailのSMTPによるメール送信で単一コネクションで複数のメールを送信する場合のマニュアルが間違えているので注意。確認したVersionと箇所は以下。

ZendFramework1.0.2
21.3. SMTP 接続による複数のメールの送信

「例 21.4. SMTP 雪像による複数のメールの送信」によると以下の様に書かれている。

require_once 'Zend/Mail.php';
$mail = new Zend_Mail();
// メッセージを作成します...
require_once 'Zend/Mail/Transport/Smtp.php';
$tr = new Zend_Mail_Transport_Smtp('mail.example.com');
Zend_Mail::setDefaultTransport($tr);
$tr->connect();
for ($i = 0; $i < 5; $i++) {
$mail->send();
}
$tr->disconnect();

が、上記だとZend_Mail_Transport_Smtpにconnectメソッドが無いのでエラーになる。

代わりにZend_Mail_Protocol_Smtpにあるのでそっちでコネクションを張ってZend_Mail_Transport_SmtpのsetConnectionメソッドでセットしてやる。

<?php
$connection = new Zend_Mail_Protocol_Smtp($host, $port);
$connection->connect();
$connection->helo();

$tr = new Zend_Mail_Transport_Smtp;
$tr->setConnection($connection);

// 以下ループ処理
$mail = new Zend_Mail();

上記方法で1コネクションで複数のメール送信が出来る。

Zend_Mail_Transport_Smtpのデストラクタでdisconnectメドッソが呼ばれて自動的に接続解除されるので通常は問題無い。しかしSMTP接続がネットワーク障害で切れてしまった場合、disconnectの前に呼ばれるSMTPコマンドのQUITで例外が投げられるがデストラクタの例外は拾えなくてFatal Errorになってしまうので注意。

標準のZend Viewより使い慣れたSmartyを使いたかったので差し替えてみることに。

Zend Framework: Document – 35.3.2. 別のテンプレートシステムの使用の項目だけだとSmartyは呼び出せても実際どうやってControllerに組み込むの?となってしまう。

とりあえずControllerのViewを差し替えてみるかと思いZend_Controller_Actionを継承してinit()でSmartyを差し替えた。

<?php
class Sample_Controller_Action extends Zend_Controller_Action {
    /**
     * @var Zend_Config
     */
    protected $_config;

    public function init() {
        // コンフィグの読み込み
        $this->_config = Zend_Registry::get('config');

        $extraParams = array(
            'compile_dir' => $config->smarty->compile_dir,
        );
        $this->view = new Sample_View_Smarty(null, $extraParams);
        $this->viewSuffix = 'tpl';
    }
}

が、上記だと上手くいかなかったわけで。

続いてActionHelperのViewRendererとしてSmartyを登録する方法で挑戦。

 $config->smarty->compile_dir,
);

// マニュアルに書かれているSmarty用View
$view = new Sample_View_Smarty(null, $extraParams);

$viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
$viewRenderer->setViewBasePathSpec($config->smarty->template_dir)
    ->setViewScriptPathSpec(':controller/:action.:suffix')
    ->setViewScriptPathNoControllerSpec(':action.:suffix')
    ->setViewSuffix('tpl');

Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);

上記方法で変更出来た。

これは継承したinit()では書かず、Controllerが呼ばれる前に書いた(Zend_Controller_Front::run()の前)。複数のテンプレートエンジン使い分ける事はほとんど無いと思われるのでこれで大丈夫かなと。

自分用にコンディションシート的なものをZendFrameworkで作ろうと思い入れてみた。少し業務で使った事もあるけどSVNチェックアウト→OK!!な

状態だったので一からセットアップ。

一通りディレクトリ作ってphp.iniにパス通して

HelloWorld!!させてみる。問題無し。StaticなURLのルーティングを確かめる、以下が想定。

http://example.com/login
Controller => auth
Action => login
<?php
$route = new
Zend_Controller_Router_Route_Static(
    'login',
     array('controller'=> 'auth', 'action' =>'login'));
$router->addRoute('login', $route);

これも問題無し。マニュアル通りだから問題無くて当然なんだけども。で、iniファイルにルーティング設定書こうと思って以下の様に書いてみた。

[production]
routes.login.type = "Zend_Controller_Router_Route_Static"
routes.login.route = "login"
routes.login.defaults.controller = "auth"
routes.login.defaults.action = "login"

読み込みはこんな感じ。

$config = new Zend_Config_Ini('../config/router.ini', 'production');
$router = new Zend_Controller_Router_Rewrite();
$router->addConfig($config, 'routes')

が、反映されてない。ルーターの値には同じものがセットされているというのに。

値が呼ばれてる所まで追ってみるかと思いつつ、先にガシガシコードに書いて後で精査してiniにしようとかなんとか。

そういえばPDT1.0がリリース。