[CakePHP] setした変数名が勝手にキャメルケースにされる

  • このエントリーをはてなブックマークに追加

ビューに変数をセットする際に引っかかったことのメモ。

概要

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で扱えます。

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。




コメント

コメントを残す