Cakephp PHP WEB開発

[Cakephp3/4]ViewCellで値参照したい場合は$thisをオプションで渡す

※本サイトはPR表記を含みます。

Cakephp2のrequestAction()、Cakephp3/4のCellについて。両方とも再利用可能な独立したパーツ作成を意図した機能

Cake2時代のrequestAction() の代替品としてCake3/4はCellという形になりました。

requestAction() は一般的にエレメントからコントローラを呼び出し、コントローラに値をセットしてもらって、それを元に描画するための仕掛けです。
https://book.cakephp.org/2/ja/controllers.html#Controller::requestAction

Cake4でこれに変わるのがセルで、セルはコントローラとビューの小さいセットで requestAction() よりも独立性を高めています。(ただし独立性が高すぎて、コントローラでセットされた viewVars をデフォルト拾えない)。

基本的にエレメントと requestAction() をセットでセル化するのが Cake2->Cake3/4のセオリーです。

これらの機能の何が便利かと言うと、あちこちに設置されるエレメントのために、エレメントが使われるであろうコントローラアクションでいちいち $this->set() しなくても済む点(独立したパーツにしやすい)。また、エレメントはキャッシュが効くので、良く使われるエレメントほどパフォーマンス効果があります。

 

難点: Cakephp3/4 のCellではviewVarsにデフォルトアクセスできない。

Controller上で$this->set()したものがView上で$this->cell()を呼び出してもいきわたらず、小さなControllerとViewという役割を持ちながら、利用する当該コントローラーの各セットデータにアクセスしにくいといった難点があります。

アクセスする方法としては、$thisをcellにオプションとして渡すことで解決します

以下、例です。予めViewCellのファイルは定義・生成されているものとする。

step
1
Cellで$thisをセットする

・例: Cellのコントローラー
hoge/src/View/Cell/HogeCell.php

<?php
namespace App\View\Cell;

use Cake\View\Cell;

class HogeCell extends Cell
{
  // $thisを$rootViewという変数名とした
    public function display($rootView)
    {
       $this->set('rootView', $rootView);
       // $rootViewが$thisとして利用できる
      $rootView->viewVars['fuga'];
       // debugで中身を見てみると、理解しやすいかも
    debug($rootView);
    }
}

 

step
2
ViewでCellを呼び出す

// 当該Viewファイル内: Cell呼び出し時にオプションで$thisを渡す
<?= $this->cell('Hoge', [$this]) ?>

これで、Cellのdisplayメソッドに$rootViewがセットされているので、Cellを呼び出した際に、各当該コントローラーにセットされている変数にアクセスできるようになります。

 

-Cakephp, PHP, WEB開発
-