$this->set(compact());
controllerからviewに渡すデータ群は一行で書ける
Cakephpのコントローラ内の各アクションで必ず利用するメソッドに
setメソッド
というものがある。
controllerからviewにデータを渡すために利用する機能で、そうすることによりview内で自由にデータを利用できるようになる。複数のデータをviewに渡す場合には、複数回setして値を渡してあげても良いのだが、一行でコンパクトにまとめて書くこともできる(以下Cakephp2.3.6で確認)。
$this->set(compact('variable1', 'variable2', 'variable3', 'variable4'));
上のように変数を引数としてまとめてcompactに渡すと各変数名でviewからアクセスできるようになる。
配列でも単一の変数でも変数名だけを引数に指定する
以下に具体例を示したが、配列でも単一のデータが格納された変数であってもcompactに渡す際は変数名を指定してあげれば済む。公式ドキュメントで、$を付けた状態の変数名を指定している例を見たことがあるが、以下の方法でも対応可能なようだ。
$variable1 = array('りんご', 'みかん', 'りんご'); $variable2 = "ぶどう"; $this->set(compact('variable1', 'variable2'));
AppController.phpで変数をsetすれば便利
memcachedをCakephpのCache機能経由で利用するでは、カテゴリツリー系のデータ構築を題材にしてある。こういった負荷の高い処理で得たデータをキャッシュし以下のようにsetしておけば、様々なview系のファイルでカテゴリデータを利用可能にしておくことができる。
public function beforeFilter(){ //カテゴリツリー構築などの負荷の高いデータ生成処理 $this->set(compact('category_tree', 'categoryList')); }
上の例では、
category_tree
categoryList
という二つの複雑なデータ構造を持つ配列をCakephpの共通処理レイヤーAppController.php内でsetしている例。これをしておくことで、常にview系のlayout、view本体、elementなどでカテゴリデータを利用可能となる。
setを個別に行うことでview内では異なる変数でデータを利用できる
compactではなく、setを複数回行うことでview側ではcontroller内とは違った変数名でデータ利用できる。以下がその例
$this->set('foo', $data); $this->set('title', $name); $this->set('canonical', $pure_url);
こちらの方を好む人もいるかもしれない。