背景
PHP PHP

[PHP] PSR-15のMiddleware Dispatcherのようなライブラリを作った

こんにちは、ナカエです。

PSR-15に出てくるMiddleware Dispatcherの定義がしっくりこなかったので、試しにMiddlewareInterfaceとDelegateInterfaceを合成するライブラリを作ってみました。

n1215/jugoya

jugoya.png

単に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なる動きもあるようです。

≪ [PHP] PSR-15 図解と雑感  |  Laravel+dynamodbで動かしてみた ≫

Web制作のお問い合わせ

075-744-6842

(平日/土曜 10:00~17:00)

 お問い合わせ