使ってますか?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に依存していなければ)
どのタイミングで動くの?
初期だと以下の順番で動作します。
- ErrorHandlerMiddleware(リクエスト処理)
- AssetMiddleware(リクエスト処理)
- RoutingMiddleware(リクエスト処理)
- CakePHP
- RoutingMiddleware(レスポンス処理)
- AssetMiddleware(レスポンス処理)
- ErrorHandlerMiddleware(レスポンス処理)
この図のようにMiddlewareを複数重ねていくイメージで動作します。
どんなところで使えるの?
認証やリクエストオブジェクトやレスポンスオブジェクトの加工、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プラグインを作ってみました。
簡単にメンテナンス画面に切り替えるためのプラグインになります。