Cakephpでviewにsetするデータをcompactでまとめる

$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);

こちらの方を好む人もいるかもしれない。

Webエンジニアブログにコメント

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Cakephpでviewにsetするデータをcompactでまとめるの記事にコメントを投稿