symfony1.1でswiftを使ってみた。
最近の開発は、ずっとsymfonyなので心中するしかないかなー、なんて思っていたりします。しかし、実際に使っていると、フレームワークではカバーしきれないコードを、ゴリゴリと、かっこ悪い方法で実装してしまったりして、嫌悪感いっぱいになってしまうことがあります。
その一つがメール周りです。symfony1.1からsfMailを使わない方向になりました(まぁ、使おうと思えば使えるけど)。そこで、代替とされているのが、Swift Mailerですね。直接SMTPが叩くので、速いだとか負荷が減るだとか、ほげほげだということで、swiftが採用されているようですが、個人的な感想を言えば、私はsfMailerで十分間に合っていたと思います。。。
とも言っていられないので、ちょっとswiftを使ってみました。でも、
How to send emails in symfony 1.1やThe symfony Cookbook How to send an emailを読んでもなんかしっくり来ないんですよね。理由は、これらのハウツーには、メールの本文をコントローラに書く方法しか提供していないからだと思います。確か前のsfMailerではViewテンプレートにメールの本文が書けたのですが、それってswiftでどうやったらいいのかなー、なんて思って調べてやってみました。まぁ、Jonathan Wageさんのアイデアなんだけどね。
というわけで、彼のアイデアをまとめると次のような感じか。
メールを使うアクションクラスをすべてsfSwiftMailerActionsの子クラスとする。
実際に呼び出す際には、親クラスの実装メソッドsendMailにモジュール名とアクション名を渡して、そのテンプレートに本文を書く。
-
<?php
-
class sfSwiftMailerActions extends sfActions
-
{
-
public function preExecute()
-
{
-
$mailVars = sfSwiftMailerVars::getInstance()->getAll();
-
-
foreach ($mailVars as $key => $value)
-
{
-
$this->$key = $value;
-
}
-
}
-
-
public function sendEmail($module, $action)
-
{
-
sfConfig::set('symfony.view.' . $module . '_' . $action . '_layout', false);
-
$body = sfContext::getInstance()->getController()->getPresentationFor($module, $action);
-
-
$mailVars = sfSwiftMailerVars::getInstance();
-
-
$message = $mailVars->has('message')
-
? $mailVars->get('message')
-
: new Swift_Message(null, null, 'text/html');
-
$swift = $mailVars->has('swift')
-
? $mailVars->get('swift')
-
: new Swift(new Swift_Connection_Sendmail(Swift_Connection_Sendmail::AUTO_DETECT));
-
-
$message->setSubject($mailVars->get('subject'));
-
$message->setBody($body);
-
-
$swift->send($message, $mailVars->get('recipients'), $mailVars->get('from'));
-
$swift->disconnect();
-
-
$mailVars->clear();
-
}
-
-
public function __set($key, $value)
-
{
-
sfSwiftMailerVars::getInstance()->set($key, $value);
-
-
return parent::__set($key, $value);
-
}
-
-
}
-
-
class sfSwiftMailerVars extends sfParameterHolder
-
{
-
-
{
-
if (!self::$instance)
-
{
-
self::$instance = new sfSwiftMailerVars();
-
}
-
-
return self::$instance;
-
}
-
-
}
ふむ。なるほど。テンプレートの内容を取るだけななら
-
$body = sfContext::getInstance()->getController()->getPresentationFor($module, $action);
でできてしまうのですね。
私が手元で実装したものでは、もう少し劣化させて、上記とは違って、SwiftクラスやSwift_Messageクラスは直書きでやってしまっています。まぁ、デフォルトの挙動なんていらないと思うので。というわけで、このソースはテストはしていません。ほぼ同じものを手元で書いて、その動作は確認しているので、だいたいのロジックはこれでいいようです。
あとは、実際のアクションクラスにこんな感じで書けばいいのですね。
-
class hogeActions extends sfSwiftMailerActions
-
{
-
public function executeEdit($request)
-
{ $swift->send($message, $mailVars->get('recipients'), $mailVars->get('from'));
-
$this->recipients = 'example@ganchiku.com';
-
$this->from = 'example@ganchiku.com';
-
$this->subject = 'hello world';
-
$this->sendEmail('hoge', 'confirm');
-
}
-
-
public function executeConfirm($request)
-
{
-
}
-
}
で、あとは、confirmSuccess.phpに本文を適当に書けばいいのですね。ふーむ。確かに、すっきりはしますが、結構面倒ですね。。。もっといい方法があったら教えてください。


今日は、どうぞ、よろしくお願いします。
私は外国人ですが、PHPで、6年以上の経験を持って、あなたのブログから、Symfony1.1の情報を見ました。
現在、私も、1.1バージョンを使っていますが、いろいろな問題を出ました。(仕方ないが、Symfony1.1の不熟の表現だと思います。)
ですから、あなたと交流したいです。もし、いいなら、私のMSNを追加してください。
また、現在では、1つの問題があります。
私はSymfonyのCURDを使ってから、新規時に、「SQL syntax」(Sql文分析エラーを出た。)、調査しでも、まだ、あります。
それは、どの様な問題ですが、分からないので、説明してもらっていいですか?
MSNで、連絡ことを楽しみね。(下記はエラーメッセージですが、参照してくださいね。)
Unable to execute INSERT statement. [wrapped: Could not execute update [Native Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘DESC) VALUES (0,’2007-03-03 02:03:00′,’fadsfasfas’,'fasfasf’,'fadsfasfas’,'fadsf’ at line 1] [User Info: INSERT INTO tb_dayreport (USERID,DATE,MAILTO,CCTO,TITLE,FILE,KONNSYUU,SENNSYUU,KINOU,KYOU,ASHITA,HORYOUU,DESC) VALUES (0,’2007-03-03 02:03:00′,’fadsfasfas’,'fasfasf’,'fadsfasfas’,'fadsfasfas’,'fadsfasfas’,'fadsfasfas’,'fadsfasfas’,'fadsfasfas’,'fadsfasfas’,'fadsfasfas’,'fadsfasfas’)]]