PSR-15リクエストハンドラーのライブラリ比較
Tuesday, April 30, 2019 09:28:00 PM
平成最後の記事は、PHP。 久々のPHP記事ですが、PSR-15に準拠したリクエストハンドラーライブラリの実装を比較してみようと思います。
PSR-15とは?
HTTPメッセージを使用するリクエストハンドラーと、ミドルウェアコンポーネントの共通インターフェースです。
それPSR-7なのでは?という鋭い人は、 @tanakahisateruさんのスライド PHP-FIGのHTTP処理標準の設計はなぜPSR-7/15/17になったのかを参照ください。
PSR-7については、だいぶ知れ渡っていると思うので、PSR-15のリクエストハンドラーに着目していきます。
PHP-15のリクエストハンドラーに対応したライブラリ
PackagistでPSR-15を検索してみました。
たくさんありますね。ということで独断と偏見(ダウンロード数が多いもの)を選んで比較してみたいと思います。
なお「フレームワーク」と書いてあるものは除外しています。
例えば zend-expressiveは minimalist PSR-7 middleware framework for PHP
と書いてあるとおりなので。
Slimなどのマイクロフレームワークも同様です。
の4つを使ってサンプルプログラム集を作ってみました。
sizuhiko/psr15-requesthandler-examples
PSR-7
まず前提事項として、PSR-7対応のライブラリが必要です。 本サンプルでは、主に zendframework/zend-diactoros を使っています。 sunrise/http-routerの例ついては、同系統にsunrise/http-messageとsunrise-php/http-server-requestがあるので、それを利用しています。 PSR-7のライブラリが違うと、どのような記述の違いがあるのかわかりやすいでしょう。
サンプルの内容
サンプルプログラム集を clone
するか、ダウンロードして、READMEの手順に従ってください。
ドキュメントルート(/
)にアクセスすると、Hello, World!
出すだけの簡単なものです。
サンプルコードの流れ
で、結局PSR-15とは?みたいな話になるわけですが、どの例も以下のような流れで動いています
- PSR-7 でHTTPリクエスト(
Psr\Http\Message\RequestInterface
)を受け取る - PSR-15の
Psr\Http\Server\MiddlewareInterface
かPsr\Http\Server\RequestHandlerInterface
でいい感じに PSR-7のHTTPレスポンス(Psr\Http\Message\ResponseInterface
) を生成する。 - PSR-7 のHTTPレスポンスをエミットする
つまり、真ん中の部分を処理することになります。
リクエストハンドラ
サンプルのsrcフォルダの下には
- Middlewares
- RequestHandlers
があり、それぞれ Psr\Http\Server\MiddlewareInterface
か Psr\Http\Server\RequestHandlerInterface
を実装したクラスが置いてあります。
で、それぞれのリクエストハンドラーからは、適したハンドラが呼び出されるようになっています。
このサンプルでは PSR-17 (HTTP Factories) を先行導入し、PSR-11 (Container Interface) に対応したライブラリでDIしてますが、 そのあたりは、次回以降で解説します。
ミドルウエアもリクエストハンドラも同じようにHello, World!
をレスポンスボディに入れるだけです。
このサンプルをとおして言いたかったこと
このサンプルでは、ドキュメントルートだけの簡単な実装でしたが、ルーターの設定を追加するだけで、 実際のアプリケーションでも使えるようになることがわかると思います。
もちろん実際にはDBにアクセスする必要もあったりするわけですが、そこにはPHP Data Objects(PDO)があり、 実際のDBの差分を吸収してくれます。 そこで利用するSQLは標準であり、Webの標準よりも長い期間利用されています。
フレームワークを利用してアプリケーションを作ることは、速く簡単に構築できます。 しかしフレームワークに依存せずPHPの標準を使うことで、柔軟にライブラリを変えても、自分のビジネスロジックを流用することができるようになります。
もちろん今日のフレームワークの多くが PSR 対応を進めていますので、フレームワークを使っていても、より互換性が高いアプリケーションを作ることができるようになるかもしれません。
次回はPSR-17について、いくつかのライブラリを紹介します。