Cakephp PHP WEB開発

【Cakephp2→4】Cellの移行について

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

Cake2からCake4への移行作業の際に、テンプレートビュー内で requestAction() と遭遇した場合、Cell 化することを検討します。

Cell 化において、間違いやすいのは「requestAction()」自体をCell化しようと考えてしまうことだと思います。

実はそうではなく、実際に requestAction() がコールされているテンプレート自体を Cell化する必要があります。よって、element全体をセル化するため、実際には requestAction() で取得されるデータなどは、Cellメソッド内でセットされていることをイメージとして捉えるとわかりやすいです。

セルビュー内には ViewVars にセットされた変数を利用するのみで解決することができます。

Cake2: requestAction()の利用例

例えば、テンプレートファイルに以下のようなコードがあるとします。

app/View/Elements/hoge.ctp

<?php
$memberLists = $this->requestAction(['controller' => 'members', 'action' => 'get_members']);
$staffLists = $this->requestAction(['controller' => 'staffs', 'action' => 'get_staffs']);
$userLists = $this->requestAction(['controller' => 'users', 'action' => 'get_users']);

// 以下ビューテンプレートにて、セレクトボックスなどでオプションで利用するなど

さきほども述べましたが、Cell に慣れていないと陥りやすいのがこの requestAction() 自体を Cell化しようとすることです。
そうではなく、「このテンプレート自体」をCell化しなければなりません。(app/View/Elements/hoge.ctp自体)

考え方は、各 $memberLists / $staffLists / $userLists はCellメソッドでセットされているということ。

ビュー出力時には各変数は Cellメソッド内でセットされているので、利用できる状態である。というイメージをすれば解決の糸口は掴めると思います。

Cake4: Cellメソッド例

src/View/Cell/HogeCell.php

<?php
declare(strict_types=1);

namespace App\View\Cell;

use Cake\View\Cell;

class HogeCell extends Cell
{
    /**
     * 各リスト取得: あくまでも例なので特に動くことは想定していない
     *
     * @param \App\View\AppView $rootView $this
     * @return void
     */
    public function hoge($rootView): void
    {
        // コントローラーアクションメソッドでセットした変数を参照するためのハック
        $this->set('rootView', $rootView);

        $memberLists = $this->Members->find('list')->toArray();
        $staffLists = $this->Staffs->find('list')->toArray();
        $userLists = $this->Staffs->find('list')->toArray();

        $this->set(compact('memberLists', 'staffLists', 'userLists'))
    }
}

Cellの定義です。役割としては、小さなコントローラーの役目を果たしています。セルビューに対するアクションメソッドを定義する。みたいな感じで考えればOKです。

具体的に第一引数の $rootView はコントローラーからのセットされている ViewVars を参照するために必要です。テンプレートのセル呼び出し時に引数 $this を渡すことでセルビューに $rootView として参照できるようになります。話の本筋ではないですが、よく使うということで載せています。

Cake4: Cellビュー例

templates/cell/Hoge/hoge.php

<?= $memberLists ?>
<?= $staffLists ?>
<?= $userLists ?>
<?php // コントローラーでセットした変数を参照できる ?>
<?= $rootView ?>

セルビューには、単純に出力するだけにしました。セルメソッド側でセットされた変数が渡ってきたものを表記しているだけなので、わかりやすいかと思います。

あとは、ビュー実装と同じ感覚で作ればよいと思います。

最後にセルを呼び出す

セルメソッドとビューを作成し終えたら、後は任意のテンプレート内でセルを呼び出すだけです。

<?= $this->cell('Hoge::hoge', [$this]) ?>

これで Cake2での requestAction() と同じ使い回しが Cake4 では Cell という形で利用できるようになります。

ただ、ケースによっては、例えば requestAction() を利用しているけれども、実はそんなにパーツ化しなくてもよかった。という様な場合では、コントローラアクション上で必要なデータを取得&セットすればよいだけの場合もあるかもしれません。(その方が工数は少なくて済むので)

ドキュメントと合わせて進めるとより作業を円滑に進めることができます。

Cakephp4: ビューセル
https://book.cakephp.org/4/ja/views/cells.html

-Cakephp, PHP, WEB開発
-