CakePHP2.0で携帯用ビューの文字コード変換

[追記:2012/03/09 14:30]
AppHelperに記述していたのは誤りでした。申し訳ないです。
AppHelperに書いてしまうと、呼び出されたヘルパの数だけcallbackメソッドが実行されるため、新しくEncodingHelperを作り、
それをAppControllerの$helpersに追加するほうが良いです。
以下のコードも書き換えました。
2.1でも問題無く動きます。


AppControllerのbeforeFilterでob_startしてafterFilterでmb_convert_encodingとかしてた記事を1.1とか1.2系の時に見てから1系は全部それで事無きを得てたんですが、なんかどうも2.0でうまく動いてなかったので公式マニュアル読みあさってたらViewとかHelperでやれやゴルァって書いてあったからその通りにしてみました。
MHelperComponentは独自コンポーネントです。
isSjisAgent()は、変換すべきかの真偽値を返すメソッド。

App/View/Helper/EncodingHelper.php

<?php
App::uses('AppHelper', 'View/Helper');
App::uses('MHelperComponent', 'Controller/Component');
class EncodingHelper extends AppHelper {
	public function afterLayout($viewFile) {
		parent::afterLayout($viewFile);
		$this->MHelper = new MHelperComponent(new ComponentCollection());
		if ($this->MHelper->isSjisAgent()) {
			$this->_View->output = mb_convert_encoding($this->_View->output, 'SJIS-win', 'UTF-8');
			mb_http_output("SJIS-win");
			ini_set('mbstring.internal_encoding', 'SJIS-win');
			ob_start("mb_output_handler");
		}
	}
}
?>

直接mb_convert_variables()で変換しようとすると
Indirect modification of overloaded property View::$output has no effect
というエラーが出るため、mb_convert_encoding()で変換したものを代入しています。


AppControllerのoutputはどこ行っちゃったんですかね…