リクエストと違った方へもアウトプットしたい。

AgaviのView部分(Response構築)はよくできている。キャッシュありスロットありレンダラの切り替え有り。
こいつをなんとか他方への出力―メール送信、ファイル書き出し、どこぞのサービスへのPOST―なんかに使えないものかと考えた。
まず、AgaviResponseクラス。こいつはレンダリングされた内容(content)の入れ物であり、サブクラスごとにHTTPだとかSoapだとかにフォーマットしてアウトプットを行うようになっている。
例えばAgaviWebResponseではHTTPのレスポンスボディとしてcontentを送信するとともに、適宜レスポンスコードやContent-Type,Set-Cookieといったヘッダの構築送信を行っている。この「送信」はsend系メソッドでこのなわれることになる。
send系メソッドはヘッダ・ボディの両方を送信するsendメソッドのみがpublicで、残りはprotectedである。また、sendContentメソッドはAgaviResponseクラスで標準出力にcontentを出力するように定義されている。
そこで、もし出力をメールとして送信したいのであれば、sendメソッドでsendmailを呼び出すなりmail関数を用いるなり、SMTPサーバと通信するなりするようにすればよい。車輪の再発明を避けてPEAR_Mailを使うことになるかもしれない。PEAR_MIMEのラッパに仕立ててやるのもいいだろう。
とりあえずこんな感じでAgaviResponseのメール対応は済みそうだ。


あとはViewで次のようにやってやればいいかな。OutputTypeはMailにしてみたりして。

<?php
Some_OneView extends ProjectBaseView {
    public function executeMail(AgaviRequestHolder $rd) {
        $response = new MailResponse();

        // 受信者設定
        $response->addReceiver('hogehoge@example.com');
        $response->addReceiver('foo@example.com', 'cc');

        // 送信者設定
        $response->setSender('oreore@example.com');

        $this->getContainer()->setResponse($response);

    // 必要なことするのです。
    }
}
?>



できないっぽいですね。AgaviExecutionFileterが自分で作ったResponseインスタンスを使ってるみたいですので。。。てことはExecutionFilterをごにょごにょしてやる必要があるみたいです。そんなことよりExecutionContainerつくってgetContentして送信するだけにしようかな・・・・・・

というか、OutputTypeごとにResponseを関連付けられれば幸せになりそうな気もするんですがどうでしょうdavidさん。*1

とりあえず、英語苦手です。むり。ほんともー無理。

*1:こんなところに日本語で書いても無意味ですね