LoginSignup
17
10

More than 5 years have passed since last update.

PHPでMiddlewareパターンを実装する方法(Interceptorパターン風)

Last updated at Posted at 2018-04-18

本稿ではPHPでMiddlewareパターンの設計と実装を紹介する。本稿で扱うMiddlewareパターンは、Interpreterパターンの変種であり、典型的なMiddlewareパターンではない。典型的なMiddlewareパターンの設計および実装は❄️PHPでMiddlewareパターンを実装する方法を参照。

Middlewareパターンとは

Middlewareパターンの目的は、「ミドルウェア」と呼ばれるガワの処理で核となるハンドラを包むことで、プログラム本来の振る舞いを拡張可能にすること。MVCウェブフレームワークでは、コントローラの入出力となるHTTPリクエストやレスポンスをアプリケーション全体で統一的に加工する用途などに採用されている。

貼り付けた画像_2018_04_18_12_20.png

ミドルウェアができることは次の3つ:

  1. クライアントコードとハンドラの間に割って入り、入力を加工する
  2. ハンドラとクライアントコードの間に割って入り、出力を加工する
  3. クライアントコードとハンドラの間に割って入り、入力がハンドラに届く前に、早期に出力を返す

Middlewareパターン(Interpreterパターン風)

本稿で扱うMiddlewareパターンは上記の機能うち2と3がない。厳密にはInterpreterパターンと言える。そのぶん、典型的なMiddlewareパターンよりも単純になっている。

設計

クラス図0.png

実装

interface Middleware
{
    public function call(int $input): int;
}
final class MiddlewareChain implements Middleware
{
    /**
     * @var Middleware[]
     */
    private $middlewares = [];

    public function add(Middleware $middleware): void
    {
        $this->middlewares[] = $middleware;
    }

    public function call(int $input): int
    {
        foreach ($this->middlewares as $middleware) {
            $input = $middleware->call($input);
        }
        return $input;
    }
}
final class IncrementMiddleware implements Middleware
{
    public function call(int $input): int
    {
        return $input + 1;
    }
}
final class TwiceMiddleware implements Middleware
{
    public function call(int $input): int
    {
        return $input * 2;
    }
}
$chain = new MiddlewareChain();
$chain->add(new IncrementMiddleware);
$chain->add(new TwiceMiddleware);

assert($chain->call(1) === (1 + 1) * 2);
assert($chain->call(2) === (2 + 1) * 2);
assert($chain->call(3) === (3 + 1) * 2);

:bow: よかったらRTお願いします !:pray:


17
10
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
17
10