26
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CakePHP3Advent Calendar 2016

Day 6

CakePHP3のMiddleware導入

Last updated at Posted at 2016-12-05

使ってますか?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/
,

26
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?