1. kozo

    Posted

    kozo
Changes in title
+CakePHP3のMiddleware導入
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,82 @@
+使ってますか?Middleware
+
+これですね。CakePHP3.3から導入されている機能ですね。
+http://book.cakephp.org/3.0/ja/controllers/middleware.html
+
+## Middlewareって何?
+
+アクセスに対するリクエスト、レスポンスに対して処理を挟むことができます。
+処理を挟むといわれると、Controllerには `initialize` とかありますけどもっと前に処理を挟むことが可能になります。なります。
+
+また、 `PRS-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](https://qiita-image-store.s3.amazonaws.com/0/49429/b84a5118-b870-04a0-e2d1-ffa56f3a7d6d.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/
+,