Cakephp PHP WEB開発

【Cakephp2→4】コントローラ編: Cake2と4間でFlashを共有する

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

Cake2 から 4 への移行作業の際の話です。Cake4 でセットしたフラッシュメッセージの後、まだ Cake2 な画面への遷移だった場合、フラッシュメッセージの受け取りができません。(できるだけ小さな単位で移行、プルリクが望ましいので、一気に画面を移行してしまうと大変なことになります。なので、Cake2な画面と移行済みのCake4な画面を行き来する形になります。)

方法としては、Cake4 でも Cake2 でも $_SESSION というグローバル変数への書込みは同じなので、それを元に Cake2 でフラッシュを新たにセットすればよいです。

Cake2でフラッシュメッセージが存在する場合、セットする

app/Controller/AppController.php

public function beforeFilter() {
    parent::beforeFilter();

    // Cake4側でフラッシュの書込みがあった際、フラッシュセットする。重複表示を防ぐためアンセットも忘れずしておく
    if (!empty($_SESSION['Flash'])) {
        foreach ($_SESSION['Flash'] as $sessionKey => $sessionValues) {
            foreach ($sessionValues as $sessionIndex => $flash) {
                $flashElement = strtolower($flash['element']);
                $flashType = explode('/', $flashElement)[1];
                $this->Flash->$flashType($flash['message'], ['key' => $sessionKey, 'escape' => false]);
            }
        }
        unset($_SESSION['Flash']);
    }
}

逆に、Cake4 にて、Cake2 でフラッシュセットされたものを予めセットしておく場合も同様な形で src/Controller/AppController.phpbeforeFilter() で定義しておけばよいと思います。

-Cakephp, PHP, WEB開発
-