
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