ユアマイスター株式会社エンジニアブログ

ユアマイスター株式会社のエンジニアが日々徒然。

CakePHP3 の Middleware 実装初級編

f:id:yourmystar_engineer:20191206112401p:plain


この記事は、 CakePHP Advent Calender 2019 6日目の記事です。


どうも。ユアマイスター星(@inase17000)です。

前回、Middlewareについて少し書きましたが、実際に動くコードがないとイメージつかない!ということでちょっとやってみました。

yourmystar-engineer.hatenablog.jp

Middlewareの概要は上記の記事にまとめていますので、併せてご覧ください。

実装の流れ

1. src/Middleware ディレクトリの作成

オリジナルのMiddlewareを追加しようと思ったら、src/Middleware ディレクトリが必要になります。

大人しくmkdirしましょう。

mkdir Middleware

2. Middlewareクラスの作成

HelperやPluginなどでも同じような実装が可能だと思います。今回はMiddlewareを使うため、便宜的にこんな実装を行いました。

<?php
namespace App\Middleware;

class MinifyHtmlMiddleware
{
    /**
     * HTML Minify Middleware
     *
     * レスポンスのBodyにある改行コードを取り除き、レスポンスを返却
     */
    public function __invoke($request, $response, $next)
    {

        // ここは、次のミドルウェアに行く前に処理される

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

        // ここは、前のミドルウェアから戻ってきた後に処理される

        if ($response->getType() === 'text/html') {
            $content = $response->getBody();
            //改行を取り除く
            $content = preg_replace("/\n|\r|\r\n/", "", $content);
            $response = $response->withStringBody($content);
        }

        return $response;
    }
}

3. Application.php から呼び出し

呼び出しには、冒頭でuse文にてimportしてから、 $middlewareQueue のキューに追加するだけで動きます。

use App\Middleware\MinifyHtmlMiddleware;


...


$middlewareQueue
    ->add(new AaaaaMiddleware())
    ->add(new AaaaaMiddleware())
    ->add(new MinifyHtmlMiddleware())   <- NEW!!!
    ->add(new AaaaaMiddleware());

キューへの追加方法は、 add() メソッドだけではなく、prepend() メソッドや insertAt() メソッド など意図的に場所を選ぶことができます。

// 追加されたミドルウェアは行列の末尾になります。
$middlewareQueue->add($layer);

// 追加されたミドルウェアは行列の先頭になります。
$middlewareQueue->prepend($layer);

// 特定の位置に挿入します。もし位置が範囲外の場合、
// 末尾に追加されます。
$middlewareQueue->insertAt(2, $layer);

// 別のミドルウェアの前に挿入します。
// もしその名前のクラスが見つからない場合、
// 例外が発生します。
$middlewareQueue->insertBefore(
    'Cake\Error\Middleware\ErrorHandlerMiddleware',
    $layer
);

// 別のミドルウェアの後に挿入します。
// もしその名前のクラスが見つからない場合、
// ミドルウェアは末尾に追加されます。
$middlewareQueue->insertAfter(
    'Cake\Error\Middleware\ErrorHandlerMiddleware',
    $layer
);

参考:https://book.cakephp.org/3/ja/controllers/middleware.html

  1. 動作確認

ここまできたら画面上から動作確認を行います。HTMLソースから改行コードが取り除かれていたら成功です。

僕の手元の環境は、インラインでJavaScriptが書かれているHTMLソースだったため、行末の ; を書いていなかったりすることで、動作しなくなった機能がありましたw上記コードはあくまでサンプルということで、他の実装をしていこうと思います。

感想

  • 実装自体はあっという間に終わり、これをどう活用しようか、、、ということを考える時間が必要です
  • Middlewareに任せるとおいしい仕事って、つまりなんなんだろうを考えていくとPSR-15で提案されている実装の意図を理解する必要がありました
  • PSR-15をはじめとするPSRをちゃんと深く読んでみようと思うきっかけになりました

ユアマイスター では一緒にはたらくエンジニアを募集しています。

▼お気軽にご連絡ください▼

https://corp.yourmystar.jp/recruit

お気軽にご連絡お待ちしてます!!