2008.08.10 Sun

[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

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

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()使いたいならば、注意しておいてください。

はてなブックマーク -   [CakePHP] setした変数名が勝手にキャメルケースにされる

タグ:

ページトップへ

TrackBack

URL:

One Comment

Leave a Comment




本文:

Get Adobe Flash playerPlugin by wpburn.com wordpress themes
ページトップへ
( ゚∀゚)o彡゜牛丼!牛丼!