読者です 読者をやめる 読者になる 読者になる

sakutarou’s blog

とりあえずWeb系技術をゆるく書いていく

CakePHP3のMiddleware導入

CakePHP3 PHP

この記事は 「Fusic Advent Calendar 2016の6日目」になります

使ってますか?Middleware

これですね。CakePHP3.3から導入されている機能ですね。
http://book.cakephp.org/3.0/ja/controllers/middleware.html

Middlewareって何?

アクセスに対するリクエスト、レスポンスに対して処理を挟むことができます。 処理を挟むといわれると、Controllerには initialize とかありますけどもっと前に処理を挟むことが可能になります。なります。

また、 PSR-7 に互換しているため、 Packagist などで公開されている PSR-7 互換のライブラリを利用することが可能となります。

例えば、 Laravelで利用されているMiddlewareをCakePHPで利用するということも可能になります。(Laravelに依存していなければ)

どのタイミングで動くの?

初期だと以下の順番で動作します。

  1. ErrorHandlerMiddleware(リクエスト処理)
  2. AssetMiddleware(リクエスト処理)
  3. RoutingMiddleware(リクエスト処理)
  4. CakePHP
  5. RoutingMiddleware(レスポンス処理)
  6. AssetMiddleware(レスポンス処理)
  7. ErrorHandlerMiddleware(レスポンス処理)

この図のようにMiddlewareを複数重ねていくイメージで動作します。

Untitled (3).png

どんなところで使えるの?

認証やリクエストオブジェクトやレスポンスオブジェクトの加工、IPアドレス制限などアプリケーションが起動する前の処理などは適した処理だと言えると思います。 レスポンス側だと、ログ出力や実行時間の計測などがいいのでしょうか。

上記の図でもそうですが、 initializeはアプリケーションが起動した後になります。 認証などは起動前の処理でいいものはいろいろとあると思われます。

Middlewareサンプル

1メソッドの中で、リクエスト処理、レスポンス処理を行います。 癖はありますね。

<?php

// src/Middleware/TrackingCookieMiddleware.php の中で
namespace App\Middleware;

class TrackingCookieMiddleware
{
    public function __invoke($request, $response, $next)
    {
        // ここでリクエスト処理

        $response = $next($request, $response);

        // ここでレスポンス処理

        return $response;
    }
}

Middlewareの使い方

Middlewareの起動などの設定は src/Application.php に記述します。 必要なMiddlewareを追記してきます。

注意点としては、作成したMiddlewareの __invoke にrequest, responseオブジェクトが渡ってきますが、 それぞれ、 Zend\Diactoros\ServerRequest, Zend\Diactoros\Response になっており、 Cake\Network\Request, Cake\Network\Response とは違うことに注意が必要です。

webroot/index.php$server->run() の引数に利用したいオブジェクトを渡すと、Cake\Network\Request, Cake\Network\Response など使いたいオブジェクトに切り替えることが可能です。

メンテナンス画面表示用プラグイン作ってみた

Middlewareの勉強がてら、 Maintenanceプラグインを作ってみました。 簡単にメンテナンス画面に切り替えるためのプラグインになります。

https://github.com/fusic/maintenance/