CakePHP compact使おうぜ

notoです。

あけましておめでとうございます。新春早々CakePHPネタです。

CakePHPで、ControllerからViewへデータを渡す際にsetメソッドを利用しますね。 そこでPHPのcompactという関数を使うともっと楽になるよってお話です。

動作環境

  • CakePHP 1.3 〜 2.0.4
  • PHP 5.3.8
  • CentOS 5.6

CakePHP始めたばかりの方は、データをViewに渡す際、恐らくこのように書くと思います。

app/Controller/HogesController.php
1
2
3
4
5
6
7
public function test(){

    $bar = 'これはbarです。';

    $this->set('bar', $bar);

}

これでview側で$barを出力すると「これはbarです。」と表示されますね。 この書き方でも、間違いではありませんが、viewへ渡すデータが増えた場合はどうでしょうか。

app/Controller/HogesController.php
1
2
3
4
5
6
7
8
9
10
11
public function test(){

    $bar    = 'これはbarです。';
    $foo    = 'これはfooです。';
    $foobar = 'これはfoobarです。';

    $this->set('bar',$bar);
    $this->set('foo',$foo);
    $this->set('foobar',$foobar);

}

setメソッドが何度も呼ばれていますね。正直これはカッコよくないです。 じゃあカッコよく書く為にはどうするかというとcompact関数を使用します。上のコードをcompact関数を使用して書きなおしてみます。

1
2
3
4
5
6
7
8
public function test(){

   $bar    = 'これはbarです。';
   $foo    = 'これはfooです。';
   $foobar = 'これはfoobarです。';

   $this->set(compact('bar', 'foo', 'foobar'));
}

setメソッドは一度呼ぶだけで済みます。compactで書く時と書かない時はどう違うの?って思う方もいると思うので、compact関数と、Controllerのsetメソッドはどういう処理をしているのか見ていきます。

1
2
3
4
5
6
7
8
<?php

$bar    = 'これはbarです。';
$foo    = 'これはfooです。';
$foobar = 'これはfoobarです。';

$result = compact('bar', 'foo', 'foobar');
print_r($result);

実行結果

1
2
3
4
5
6
Array
(
    [bar] => これはbarです。
    [foo] => これはfooです。
    [foobar] => これはfoobarです。
)

変数名をキーとして連想配列化されています。extract関数の逆の処理を行なっているわけです。次にCakePHPのコアな部分Controllerクラスのsetメソッドを覗いてみます。

1
2
3
4
5
6
7
8
9
10
11
12
public function set($one, $two = null) {
    if (is_array($one)) {
        if (is_array($two)) {
            $data = array_combine($one, $two);
        } else {
            $data = $one;
        }
    } else {
        $data = array($one => $two);
    }
    $this->viewVars = $data + $this->viewVars;
}

$this->set('bar', $bar);とした場合、どういう処理が行われているかというと、9行目が該当箇所になります。barをキー、変数$barをバリューとして配列を作成しています。それを$this->viewVarsというグローバル変数に代入しています。

2回目にsetが呼ばれた場合、11行目にある通り、配列演算子で結合されています。連想配列化してますね。 つまりsetメソッドの中でやっていることは、compact関数と対して変わらないということです。

ちょっとしたことですが、僕はCakePHPではcompact関数はよく使ってます。他ではあまり使わないですが。。。