[PHP] PSR-15 図解と雑感
こんにちは、ナカエです。本日は草案状態のPSR-15についての記事です。
PSR-15は、PSR-7のHttp Messagesを元にしたHTTPミドルウェアの標準化を目指すものです。
PSR-15の2つのインターフェース
MiddlewareInterface
こちらがおなじみのミドルウェアを指します。ServerRequestInterfaceとDelegateInterfaceを引数にとってResponseInterfaceを返すメソッドを実装しています。
典型的な処理のフローは
- リクエストを修正(前処理)
- 処理をDelegateInterfaceに任せる(スキップも可)
- 返ってきたレスポンスを修正(後処理)する
となっています。
DelegateInterface
MiddlewareInterfaceがHTTPアプリケーションにかぶせる皮と見なせるのに対し、DelegateInterfaceは芯とみなせます。
HTTPミドルウェアの引数のcallableもしくは\Closureとして型付けられていた関数の型をより厳密に指定したものといえば既存実装に慣れ親しんだ人にはわかりやすいかもしれません
ServerRequestInterfaceを入力としてResponseInterfaceを出力とするHTTPアプリケーションなら何でもDelegateInterfaceの実装となりえます。
Middleware Dispatcher
上記2つのインターフェース実装の組み合わせにより再び同じインターフェースを満たすオブジェクトを構成することが可能になっています。
- MiddlewareInterface + MiddlewareInterface → MiddlewareInterface
- DelegateInterface + MiddlewareInterface → DelegateInterface
- DelegateInterface + MiddlewareInterface * N → DelegateInterface
つまりは
- 皮と皮を組み合わせたものを再び皮とみなせる
- 芯と皮を組み合わせたものを再び芯とみなせる
ということです。
Middleware Dispatching SystemはこれらのComposableな性質を元に、DelegateInterfaceと複数のMiddlewareInterfaceから新たなDelegateInterfaceを生成する仕組みとなります。
DelegateInterfaceという命名
- HTTPアプリケーションという芯にミドルウェアという皮を被せて新しいHTTPアプリケーションを作る
- それらの組み合わせを自由に入れ替えてHTTPアプリケーションを構築できる
というのがミドルウェアシステムの標準化の目的であると言えるでしょう。
MiddlwareInterfaceとDelegateInterfaceを一見しただけだと、DelegateInterfaceが副次的なものであるかのような印象になりがちではないかと思っています。
あくまでこの命名はミドルウェアからコアのHTTPアプリケーションを見た時に処理の委任先として捉えられるということでしょう。
DelegateInterfaceはHTTPアプリケーションを表しているもので、ミドルウェアはDelegateInterfaceを支えるための脇役であるという逆の捉え方もできれば、しっくりくるのではないでしょうか。