ビューに変数をセットする際に引っかかったことのメモ。
概要
CakePHPバージョン1.2.0.7296 RC2で確認。
AppController::set()
のメソッドで第一引数だけに連想配列を指定したときはアンダースコアの入った変数名がキャメルケースに変換されてしまう。
例えば
$hoge_fuga = 'piyo';
$this->set(compact('hoge_fuga'));
のようにセットするとビューに$hoge_fuga
という変数は定義されておらず、かわりに$hogeFuga
にセットされる。
ソース解析
cake/libs/controller/controller.php:587
function set($one, $two = null) {
$data = array();
if (is_array($one)) {
if (is_array($two)) {
$data = array_combine($one, $two);
} else {
$data = $one;
}
} else {
$data = array($one => $two);
}
foreach ($data as $name => $value) {
if ($name == 'title') {
$this->pageTitle = $value;
} else {
if ($two === null && is_array($one)) {
$this->viewVars[Inflector::variable($name)] = $value;
} else {
$this->viewVars[$name] = $value;
}
}
}
}
605行目でキー名にInflector::variable()
が使われている。
cake/libs/inflector.php:416
function variable($string) {
$string = Inflector::camelize(Inflector::underscore($string));
$replace = strtolower(substr($string, 0, 1));
$variable = preg_replace('/\\w/', $replace, $string, 1);
return $variable;
}
思いっきりアンダースコアをキャメライズしてます。
結論
第二引数を指定する方法だとキャメライズを回避する事が可能のようです。なんでこういう仕様なのかわかりませんが、こういうところマニュアルに載せて欲しいですね。
とにかく、どうしてもcompact()
使いたいならば、注意しておいてください。
2011.02.23 補足
1.3では仕様が変わっています。
1.2から1.3への移行ガイド :: 付録 :: マニュアル :: 1.3コレクション
Controller::set()は$var_nameを$varNameに置き換えなくなりました。変数はあなたがセットした通りにViewで扱えます。
コメント
[…] 参照情報: http://www.rainorshine.asia/2008/08/10/post602.html […]