CakePHP3 から CakePHP4 に移行したら Middleware が動かなくなった #cakephp
現象
CakePHP3 から CakePHP4 に移行した際に、CakePHP がデフォルトで提供しているミドルウェアを拡張して利用していた Middleware が動かなくなった。(正確には意図しない挙動になった)
原因
CakePHP3 ではミドルウェアは __invoke($request, $response, $next)
を実装すればよかった。
しかし PSR 15 対応が行われたことにより、 __invoke
メソッドは呼ばれなくなってしまった。
// Cake の提供している Middleware を拡張
class MyMiddleware extends ErrorHandlerMiddleware
{
// 呼ばれなくなってしまった。。
public function __invoke($request, $response, $next)
{
// do something
}
}
対応
CakePHP4 では、 ミドルウェアに MiddlewareInterface を実装する必要がある。
ただし今回の場合は拡張なので、 ( __invoke
ではなく) process($request, $handler)
をオーバーライドすればよい。
// Cake の提供している Middleware を拡張 class MyMiddleware extends ErrorHandlerMiddleware { public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { // do something } }
感想
拡張していることにより拡張元のメソッドが呼ばれることによって、パッと見動いているようになっていた。
それゆえに少し原因特定に時間がかかってしまった。
移行ガイドでも互換性があるように読み取れるし、拡張であったがゆえに見逃しやすい気がする。