2008/09/21

symfony1.1でswiftを使ってみた。

最近の開発は、ずっとsymfonyなので心中するしかないかなー、なんて思っていたりします。しかし、実際に使っていると、フレームワークではカバーしきれないコードを、ゴリゴリと、かっこ悪い方法で実装してしまったりして、嫌悪感いっぱいになってしまうことがあります。

その一つがメール周りです。symfony1.1からsfMailを使わない方向になりました(まぁ、使おうと思えば使えるけど)。そこで、代替とされているのが、Swift Mailerですね。直接SMTPが叩くので、速いだとか負荷が減るだとか、ほげほげだということで、swiftが採用されているようですが、個人的な感想を言えば、私はsfMailerで十分間に合っていたと思います。。。

とも言っていられないので、ちょっとswiftを使ってみました。でも、
How to send emails in symfony 1.1The symfony Cookbook How to send an emailを読んでもなんかしっくり来ないんですよね。理由は、これらのハウツーには、メールの本文をコントローラに書く方法しか提供していないからだと思います。確か前のsfMailerではViewテンプレートにメールの本文が書けたのですが、それってswiftでどうやったらいいのかなー、なんて思って調べてやってみました。まぁ、Jonathan Wageさんのアイデアなんだけどね。

というわけで、彼のアイデアをまとめると次のような感じか。
メールを使うアクションクラスをすべてsfSwiftMailerActionsの子クラスとする。
実際に呼び出す際には、親クラスの実装メソッドsendMailにモジュール名とアクション名を渡して、そのテンプレートに本文を書く。

  1. <?php
  2. class sfSwiftMailerActions extends sfActions
  3. {
  4.   public function preExecute()
  5.   {
  6.     $mailVars = sfSwiftMailerVars::getInstance()->getAll();
  7.  
  8.     foreach ($mailVars as $key => $value)
  9.     {
  10.       $this->$key = $value;
  11.     }
  12.   }
  13.  
  14.   public function sendEmail($module, $action)
  15.   {
  16.     sfConfig::set('symfony.view.' . $module . '_' . $action . '_layout', false);
  17.     $body = sfContext::getInstance()->getController()->getPresentationFor($module, $action);
  18.  
  19.     $mailVars = sfSwiftMailerVars::getInstance();
  20.  
  21.     $message = $mailVars->has('message')
  22.       ? $mailVars->get('message')
  23.       : new Swift_Message(null, null, 'text/html');
  24.     $swift = $mailVars->has('swift')
  25.       ? $mailVars->get('swift')
  26.       : new Swift(new Swift_Connection_Sendmail(Swift_Connection_Sendmail::AUTO_DETECT));
  27.  
  28.     $message->setSubject($mailVars->get('subject'));
  29.     $message->setBody($body);
  30.  
  31.     $swift->send($message, $mailVars->get('recipients'), $mailVars->get('from'));
  32.     $swift->disconnect();
  33.  
  34.     $mailVars->clear();
  35.   }
  36.  
  37.   public function __set($key, $value)
  38.   {
  39.     sfSwiftMailerVars::getInstance()->set($key, $value);
  40.  
  41.     return parent::__set($key, $value);
  42.   }
  43.  
  44. }
  45.  
  46. class sfSwiftMailerVars extends sfParameterHolder
  47. {
  48.   static $instance = null;
  49.  
  50.   public static function getInstance()
  51.   {
  52.     if (!self::$instance)
  53.     {
  54.       self::$instance = new sfSwiftMailerVars();
  55.     }
  56.  
  57.     return self::$instance;
  58.   }
  59.  
  60. }

ふむ。なるほど。テンプレートの内容を取るだけななら

  1. $body = sfContext::getInstance()->getController()->getPresentationFor($module, $action);

でできてしまうのですね。

私が手元で実装したものでは、もう少し劣化させて、上記とは違って、SwiftクラスやSwift_Messageクラスは直書きでやってしまっています。まぁ、デフォルトの挙動なんていらないと思うので。というわけで、このソースはテストはしていません。ほぼ同じものを手元で書いて、その動作は確認しているので、だいたいのロジックはこれでいいようです。

あとは、実際のアクションクラスにこんな感じで書けばいいのですね。

  1. class hogeActions extends sfSwiftMailerActions
  2. {
  3.   public function executeEdit($request)
  4.   {    $swift->send($message, $mailVars->get('recipients'), $mailVars->get('from'));
  5.     $this->recipients = 'example@ganchiku.com';
  6.     $this->from = 'example@ganchiku.com';
  7.     $this->subject = 'hello world';
  8.     $this->sendEmail('hoge', 'confirm');
  9.   }
  10.  
  11.   public function executeConfirm($request)
  12.   {
  13.   }
  14. }

で、あとは、confirmSuccess.phpに本文を適当に書けばいいのですね。ふーむ。確かに、すっきりはしますが、結構面倒ですね。。。もっといい方法があったら教えてください。

2008/09/02

日系二世はドラマチックな人が多い。

ハワイに来ている目的は、日系人たちの昔の生活や文化などをなんかしらの方法で、デジタル化して残していこうということなんですね。すでに移民の一世は全滅しているのですが、二世はかろうじて生きています。だいたい80歳オーバーなので、おそらくあと10年経ったら、一気に減るだろうなー。

リリウオカラニ公園今、私がいるハワイ島のヒロというところは、この日系移民が多かった場所で、今でも多くの日系人が住んでいる。右の写真は、ヒロにあるリリウオカラニ公園の鳥居とマウナケアが写っているもの(ちなみ私はよくこの公園の周りをジョギングしている)。実際は、若い日系人は、すでに本土に移住してしまったりしていることが多いのだけども、おじいちゃんやおばあちゃんは日系人がいっぱいいる。そして、太平洋戦争のときに関係があったのが、二世もしくは、一世なんですね。一世は、日本人なので、そのまま強制就労所に入れられるわけだが、二世はすごく複雑な状況になったようだ。実際は、アメリカ側に付いて、最初はヨーロッパにアメリカ軍として参加することになるのだが、終戦間際には、日本にも行っている。ただ、この時期に日本に帰っている移民の家族もいたわけだ。そして、彼らは日本軍に付くことになる。また、戦後にマッカッサーと昭和天皇の間に入ってやりとりしていたのも、日系二世だったりするわけだ。日系二世は、日本語学校で教育を受けていたので、教育勅語を習っているわけ。そんな人たちなので、日本がなんとか残る方向で努力をしたようだ。

しかしながら、私たちの歴史教育では誰もこんなことを学ばないよね。誰も話したがらないし、私も知らなかった。ということで、戦争のみならずだけど、日系二世の文化や生活を残すという活動をしているわけ。
私とルース
右の写真に写っているのも私と日系二世のおばあちゃん。なんでも、ハワイでコンサートをしていた美空ひばりの伴奏をしていたとか。

私は歴史学者でもなんでもないのだけど、今生きている二世の話を聞く機会があるので、とても勉強になっている。

さて、件名に書いたように日系二世にはドラマチックな人生を歩んだ人が多い。もちろん、それは太平洋戦争が関係がある。最近、映画の主人公になれるんじゃないか、と思われる人生を歩んだ二人会ったので書いてみることにする。

一人は、日系二世として、ハワイで生まれたが、戦争前に帰国しており、その後、広島で育って、妹は原爆で死亡し、自分は神風特攻隊になったが、終戦したため、実際に行くことはなかった人。そして、彼は最後の日系移民として、またハワイに戻ることになった。日本軍になっていたため、アメリカの市民権は取り上げられていたし、今でもアメリカで語り継がれる神風の一員だったので、そんな人がアメリカに来て、いろいろ最初は大変だったに違いない。神風の一員で、その後、アメリカに移住したなんて彼くらいしかいないんじゃないかな。しかも、まだまだ元気。実は、アメリカに帰ってきてからもドラマがあるらしいのだけど、詳しくは聞いていない。その彼は自伝のような書籍を出すようだ。私の手元にもドラフトがある。

もう一人は、彼女も日系二世として、ハワイに生まれたが、同じく戦争前に帰国しており、英語と候文ができるため、戦争中は、英語の情報を候文に翻訳していた人。読む人は、東条英機だったと。東条英機は、候文しか書いたり、読んだりしなかったらしい。戦後は、逆にマッカーサーへの文書の翻訳をしていたそうだ。マジっすか。なんだか歴史の授業のようなんだけど。。。彼女の場合は、軍隊に入っていたわけではないので、その後、アメリカに戻ることができたようだ。彼女の話では、戦争中は牛乳はタダで手に入ったらしい。戦争中は、東京に住んでいたそうなのだが、大使館に牛乳を売る店があったようなのだけど、日本人は牛乳を飲まないので、店に行ってタダでもらっていたそうだ。今、聞くとマジっすか!といった内容がいろいろある。

まぁ、こんな感じですごく不思議なアメリカにいます。私の今まで知っていたアメリカとは大違いだ。朝のマクドナルドでは、日系二世のおじいちゃんやおばあちゃんがいっぱいコーヒーを飲みにくるらしい。シニアプライスで60セントだからね。なんか不思議な感じ。私も日系二世のおばあちゃんにマクドナルドおごってもらいました。マックチキンとサイドサラダとコーヒーとサンデーで$4を切るという不思議な値段。コーヒーはシニアプライスだから。

何人かは私にアメリカに移住すればいい、と言ってくれているけど、したくてもアメリカは受け入れてくれないですから!

しかし、ハワイに来て一度も泳いでいない。ダイビングも一度だけ。。。日本にいたときは、毎日泳いでいたのに。。。あと一ヶ月ハワイにいます。免許も取ろうかしら。ハワイは免許を持っていれば、ローカルプライスでいろいろ安くなるので。

Bloglines feedburner