• 締切済み

zend frameworkでの拡張について

PHP5.2.4、zend framework1.9.5を使用しています。 Zend_Captcha_WordクラスのgetSession関数内の $this->_session->setExpirationHops(1, null, true); を $this->_session->setExpirationHops(2, null, true); に書き換えたいのですが、できれば元のファイルを書き換えることなく 例えばZend_Captcha_WordExというZend_Captcha_Wordを継承したクラスで getSession関数を書き換えればいいと思ったのですが、しかしそうすると Zend_Captcha_Wordを継承している class Zend_Captcha_Image extends Zend_Captcha_Word{ } や class Zend_Captcha_Figlet extends Zend_Captcha_Word{ } までZend_Captcha_WordExに書き換えないといけないので、 この派生クラスを作って書き換えるやり方は現実的ではないと思いました。 zend frameworkにおいてこういう場合はどのようなやり方で記述すれば良いのでしょうか?

みんなの回答

noname#243182
noname#243182
回答No.1

継承元のメソッド「Zend_Captcha_Word::getSession()」でセッションオブジェクトを取得した後、利用者自身がもう一度「Zend_Session_Namespace::setExpirationHops()」メソッドにて必要な値をセットしてやればよいのではないでしょうか。 それ以外にも、「Zend_Captcha_Image」や「Zend_Captcha_Figlet」を継承してから「Zend_Captcha_Word::getSession()」をオーバーライドすることで希望する動作に変更しても実現可能です。 ・ゲッターメソッド経由での設定変更 ・継承元のメソッドをオーバーライドして動作変更 マニュアル見ただけですので、アドバイスで投稿いたします。

参考URL:
http://zendframework.com/manual/ja/zend.session.advanced_usage.html
takagoo100
質問者

お礼

ご回答ありがとうございます。 そもそもなんでsetExpirationHopsを2にしたいかですが、 Zend_FormにCaptchaの設定などを記述したconfigを利用して 一連の登録フローの値チェックなどを行った時に、 入力画面 → 確認画面 → 完了画面 と間に確認画面を挟むと、ホップが1だと確認画面でセッションがなくなって 完了画面の時には値チェックができなるなるからです。 (もちろん確認画面でバリデーションが通ってるなら serializeなどをしたデータを次に引き継げば、もう値チェックをしなくても いいのかもしれませんが・・・) 理由はこのようなことなのですが、ただもうそういうこと関係なく オリジナルをいじることなくzend frameworkの派生クラスを たくさん所持している抽象クラスなどを拡張する方法はないかと思いました。 なのでZend_Formを利用していますので、 ソースコードを見てみるとisValid内でgetSessionをしてるようなので >継承元のメソッド「Zend_Captcha_Word::getSession()」でセッションオブジェクトを取得した後、利用者自身がもう一度「Zend_Session_Namespace::setExpirationHops()」メソッドにて必要な値をセットしてやればよいのではないでしょうか。 は無理だと思います(たぶん?) >それ以外にも、「Zend_Captcha_Image」や「Zend_Captcha_Figlet」を継承してから「Zend_Captcha_Word::getSession()」をオーバーライドすることで希望する動作に変更しても実現可能です。 これは、 class Zend_Captcha_ImageEx extends Zend_Captcha_Image { public function getSession() { this->_session->setExpirationHops(2, null, true); } } class Zend_Captcha_FigletEx extends Zend_Captcha_Figlet { public function getSession() { this->_session->setExpirationHops(2, null, true); } } という認識よろしいでしょうか? だとすると、それぞれ(ImageやFiglet)に同じような処理を書かなければならないので そうではなくて1箇所(例えばZend_Captcha_Word)を書き換えるとかするだけで やることはできないのでしょうか?

関連するQ&A

専門家に質問してみよう