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
1Cellで$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
2ViewでCellを呼び出す
// 当該Viewファイル内: Cell呼び出し時にオプションで$thisを渡す <?= $this->cell('Hoge', [$this]) ?>
これで、Cellのdisplayメソッドに$rootViewがセットされているので、Cellを呼び出した際に、各当該コントローラーにセットされている変数にアクセスできるようになります。
■ Cakephp4 ViewCell