cakephp5 の罠

なにが罠か

namespace App\Controller;

use App\Controller\AppController;

use Cake\Event\EventInterface;



class ErrorController extends AppController{

︙

	public function beforeRender(EventInterface $event)

	{

		parent::beforeRender($event);

		$this->viewBuilder()->setTemplatePath('Error');  // <= ①

	}

︙

}

namespace App\Controller 配下の ErrorController に App\Controller\AppController を継承するようなコードをよく見るが Cake/Http/Exception 配下の XxxxException をスローすると ErrorController 内に ① を書いておかないと View の組み立て時に Cake\View\Exception\MissingElementException がスローされ基底の Cake\Controller\ErrorController を再生成することになるので beforeRenderer が二度走ることになる。発生箇所はたぶんここ

セッションクッキーを破棄したら破棄するクッキーと新しいクッキーがセットで発行されたので気付いた。この問題の解決には至ってない。

namespace App\Controller;



use Cake\Event\EventInterface;

use Cake\Controller\ErrorController as RootErrorController;



class ErrorController extends RootErrorController

{

︙

	public function beforeRender(EventInterface $event)

	{

		parent::beforeRender($event);

	}

︙

}

こうすることで setTemplatePath の書き忘れを回避できるが AppController に集約したメソッドが使えなくなるので trait に切り出すなりする必要が出てくる。アップデートで dispatch で事前にセットしてくれたらいいんだが。