[PHP] PSR-15のMiddleware Dispatcherのようなライブラリを作った
こんにちは、ナカエです。
PSR-15に出てくるMiddleware Dispatcherの定義がしっくりこなかったので、試しにMiddlewareInterfaceとDelegateInterfaceを合成するライブラリを作ってみました。
n1215/jugoya
単にMiddlewareInterfaceとDelegateInterfaceを実装するインスタンスを合成するのみだと、インスタンスの生成を別途行わなければならないので、PSR-11のContainerInterfaceを用いたインスタンスの解決もできるようにしてあります。
やっていることは単純で、ファクトリーに下記2つの引数を渡すとHttpApplicationというDelegateInterfaceを実装したオブジェクトが作成される、というだけです。
- 第一引数 $coreDeelegateRef: 第二引数のMiddleware群に包まれるコアのDelegate。 DelegateInterface、DelegateInterfaceと同じシグネチャのcallable、もしくはPSR-11コンテナでDelegateInterfaceとして解決できるID(文字列)
- 第二引数 $middlewareRefs: Middlewareのスタック。 MiddlewareInterface, MiddlewareInterfaceと同じシグネチャのcallable、もしくはMiddlewareInterfaceとしてPSR-11コンテナで解決できるID(文字列)からなる配列
class HttpApplicationFactory
{
/**
* @param DelegateInterface|callable|string $coreDelegateRef
* @param MiddlewareInterface[]|callable[]|string[] $middlewareRefs
* @return HttpApplication
*/
public function create($coreDelegateRef, array $middlewareRefs)
{
//略
};
}
感想
いくつか既存のPSR-15Middleware Dispatcher系のライブラリを調べましたが、Middleware DispatcherたるクラスがDelegateIntefaceを実装するのか、MiddlewareInterfaceを実装するのか派閥が分かれているようでした。
jugoyaはDelegateInterfaceを実装したHttpApplicationクラスをメインに据え、MiddlewareDispatcherというクラス名は使っていません。
実装していく中で、DelegateInterfaceという命名があまり良くないのではと感じました。 ServerRequestHandlerInterfaceとでも名付けたほうがが本質を突いていて、 名前を変えたDelegateInterfaceを別PSRにしてしまえば、PSR-15のスコープも狭まって良いのではないかと思います
実際にhttp-message-strategiesなる動きもあるようです。