Smarty互換でSmartyより軽量なTemplateLiteを使う
に書いた後適度に使っていたところ、Smartyと決定的な差異を発見。
TemplateLiteはオブジェクトにアクセスできない。はじめからオブジェクトをアサインしないような作りにしておけば問題無いものの、既にSmartyでオブジェクトをアサインして使っている場合、テンプレートエンジンをそのまま差し替えるわけにはいかないので注意。
例えば、Zend_Validateのエラー結果を纏めて以下のようなクラスに渡したオブジェクトをアサインしているとする。
<?php
/**
* @package Sample
*/
class Sample_Validate_Result {
/**
* @var array
*/
private $_errors;
/**
* @param array $errors
*/
public function __construct(array $errors) {
$this->_errors = $errors;
}
/**
* エラーの有無を返す
*
* @param string $name
* @return mixed
*/
public function __get($name) {
if (array_search($name, $this->_errors) !== false) {
return true;
} elseif (!array_key_exists($name, $this->_errors)) {
return false;
} else {
return new Sample_Validate_Result($this->_errors[$name]);
}
}
}
その状態でテンプレートからアサインしたオブジェクトのメンバ変数にアクセスしようとTemplateLiteの場合、evalに失敗してエラー。
<?php
// Validatorから帰ってくるエラー例
$errorArray = array(
'nickname' => array('isEmpty'),
'mailaddress' => array('tooLong', 'invalid')
);
// コントローラー内でエラーオブジェクトをアサイン
$this->view->errors = new Sample_Validate_Result($errorsArray);
// Smartyならこれができる
{ if $errors->nickname->isEmpty }
完全互換だと思っていて差し替えが後になってしまうと、影響範囲も広がってしまうので記憶の片隅にでも。
