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