1年ほど前に作ったソースを整理していた。
Zend_View_AbstractでSmartyを使うクラスのソースを見つけた。
動作原理
Delegation。Zend_View_AbstractをextendsしたZend_View_Esterが処理をSmartyへDelgateする、デザインパターンでいうと、BridgeパターンかAdaptorパターンかな。
class Zend_View_Ester extends Zend_View_Abstract{ protected $smarty; public function __construct( $smarty_instance ){ if( $smarty_instance instanceof Smarty ){ $this->smarty = $smarty_instance; $this->addScriptPath = $smarty->template_dir; }else{ throw new Zend_Exception("Smartyのインスタンスをセットしてください。"); } } /** * Zend Action側からassign * @param mixed(array,string) $arg1 Array:Smartyにセットする値 String:Smartyにセットする前 * @param mixed(string,int,bool ...etc) $arg2 Smartyに$arg1の名前でセットする値 */ public function assign( $arg1 , $arg2 = null ){ //overload 配列に対応させる if( is_array( $arg1 ) ){ return $this->assignArray($arg1); } //文字列の時 if( is_string( $arg1 ) ){ $this->smarty->assign( $arg1, $arg2 ); return; } } /** * assignを何度もCallするのが面倒なとき配列で一気に値をセットする * * @param array $array hashed ArrayMap 名前と値がセットになった配列 */ public function assignArray( $array ){ if(is_array( $array )){ foreach( $array as $name => $value ){ $this->smarty->assgin( $name, $value ); } } return; } /**/ public function _run( $filepath ){ return $this->smarty->display( $filepath ); } }
なんでもExtendsする先輩がいた。どう考えてもDelegationの方が良いと思う。
ちなみに、Esterの名前の由来はエステル結合。二つの異なる性質を結合させた化合物。
Symfony、Symfonyと連呼しているので最近ZendFrameWork触ってない。Zend_View_Interfaceが追加されるのはいつだろう。