それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ZendFrameWorkでSmartyを使うために作ったクラス

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の名前の由来はエステル結合。二つの異なる性質を結合させた化合物。

SymfonySymfonyと連呼しているので最近ZendFrameWork触ってない。Zend_View_Interfaceが追加されるのはいつだろう。