開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. PHP >
  4. [PHP] PSR-15のMiddleware Dispatcherのようなライブラリを作った
[PHP] PSR-15のMiddleware Dispatcherのようなライブラリを作った

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

  • posted by もりちゃん
  • PHP
TOPに戻る