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が追加されるのはいつだろう。