【CakePHP4入門】ビュー:セルの使い方

CakePHP4のセルの使い方

Webサイトを作成していると、複数ページで共通のヘッダーやフッターやナビゲーションになっている場合があります。
もし各ページごとにこの共通箇所を重複して記述していると、実装や修正が面倒です。
CakePHPでは、こういった共通箇所を重複せずにパーツ分けして管理する方法として、以下の便利な機能が用意されています。

  • レイアウト
  • エレメント
  • セル

今回はそのうちの「セル」についてみていきたいと思います。

CakePHP4のセルが使えるシチュエーション

セルはページの中の要素をパーツ化する仕組みです。同じようなものに「エレメント」があります。
エレメントの使い方については以下を参考にしてください。
参考 【CakePHP4入門】ビュー:エレメントの使い方

セルがエレメントと異なるところは、セルはコントローラと同じようにそのセルが読み込まれるときに実行されるメソッドをセルクラスに用意することができる点です。ですので、そのメソッドの中で、コントローラと同様にモデルを呼び出してDBの値を取得する、といったことに適しています。例えば、「新着記事を表示したい」とか、「ランキングを表示したい」といった場合が想定できます。

処理自体はセルの中で行っているので、ビューテンプレート側はそのセルを読み込むだけでOKなわけです。

memo
セルはコントローラと似たような構成をしており、DBを参照するような処理に適している。
エレメントは複数ファイルで共通な部分を別ファイルに抽出するという点は同じだが、DBをしないようなときに適している。

CakePHP4のセルの使い方

ではセルを実装してみましょう。

前提条件
・Vagrant上のCentOSで実施しています。
・CakePHP4.1.4をインストールしています。

セルを作成するときは「bake」コマンドが使えます。
CakePHPのインストールディレクトリで次のコマンドを実行してみましょう。

./bin/cake bake cell Sample

すると「View/Cell/」ディレクトリの下に「SampleCell.php」というファイルが作成されます。
また、「templates/cell」ディレクトリの下に「Sample」というディレクトリが作成され、その下に「display.php」という空のファイルが生成されます。

SampleCell.phpを見てみると

public function display()
{
}

というメソッドが用意されていますが、これが「diplay.php」を表示する際に動くメソッドになります。
このようにメソッド名とセルテンプレートのファイル名で紐づけを行っているのですね。

displayメソッドの中に以下のように処理を記述してみましょう。

public function display()
{
    $this->set('msg','Hello');
}

Controllerの時と同じように変数をセットすることができます。

ではセルテンプレート側でこの変数を表示してみましょう。

<?=h($msg)?>

通常のテンプレートでコントローラでsetした変数を表示するのと同じように表示できます。
では、このセルをテンプレートで読み込んでみましょう。テンプレートは何でも構いません。
次のように記述してみてください。

<? echo $this->cell('Sample'); ?>

ブラウザで表示した際に「Hello」が表示されればOKです。

ここまでのまとめ
このようにセルのメソッド内で処理をし、セルテンプレートでその結果を使ったHTMLを生成し、それをテンプレート側で読み込むという動きになっています。

CakePHPのセルの応用

さらにセルは、冒頭に書いたようにモデルを使った処理を書くこともできます。先ほどのdisplayメソッドの中で例えば、

$this->loadModel('Samples'); //Sampleモデルのロード
        $sample_query = $this->Samples->find(); //Samplesテーブルからレコード取得
        $this->set('sample_count',$sample_query->count()); //件数を取得し、sample_count変数に格納

といったように、コントローラで記述するような処理を書くことができます。

また、displayメソッド以外にメソッドを作成し、その名前でセルテンプレートを作成してあげて、そのセルを読み込むこともできます。
例えば、

public function sampleMethod()
{
    $this->set('msg','GoodMorning');
}

このような「sampleMethod」を作成してあげた場合、次のように呼び出すことができます。

$this->cell('Sample::sampleMethod');

このとき、セルテンプレートのファイル名は「sample_method.php」というスネークケースにしてあげます。
もしファイル名がメソッド名とセルテンプレートのファイル名の紐づけルールに沿わない場合は、次のようにrenderメソッドを使ってファイル名を指定することも可能です(下の例の場合は「another_template.php」)。

public function sampleMethod()
{
    $this->set('msg','GoodMorning')->render('another_template');
}

また、エレメントの時と同様に、セルを読み込み時に引数を渡すことができます。
次のように、cellメソッドの第二引数に配列形式で引数を渡す場合、

$this->cell('Sample::sampleMethod',['引数1','引数2']);

次のようにセルメソッド側では、2つの引数を受け取ったことになります。

public function sampleMethod($arg1,$arg2)
{
    $this->set('msg',$arg1 . $arg2);
}

上記の場合「引数1引数2」と表示されることになります。

なお、エレメントと同様ですが、セルテンプレート側変数h()関数を使ってHTMLエンティティ化している場合、呼び出し側は「echo」でセルを呼び出さないと、セル側で使用するHTMLタグがエンティティ化されて表示されてしまう点に注意が必要です。

今回の内容はCakePHPのドキュメントを参考にしています。
参考 ビューセル