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

スポンサーリンク
管理人

システムえんじにゃー🐈
趣味はエレキギターなど。作曲したい。
WoWs/プリコネ
記事に関する質問はお気軽にどうぞ。

surface0 (さーふぇす)をフォローする
surface0 (さーふぇす)をフォローする
Rain or Shine

コメント

タイトルとURLをコピーしました