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について、いくつかのライブラリを紹介します。
Recent Articles
- GAE gen1 で動いている PHP5.5 で作った個人開発サービスを gen2 PHP8.2 へ移行した1年記 〜 その 2 2024/03/20
- GAE gen1 で動いている PHP5.5 で作った個人開発サービスを gen2 PHP8.2 へ移行した1年記 〜 その 1 2024/03/20
- マルチプルレポをモノレポへコミットログを残しながら移行する 2023/09/27
- tsyringe を TypeScript 5 で使う方法 2023/05/02
- LocalStack を使って aws-sdk の Integration Test を実行する 2023/04/19
- AWS SDK v3 のモジュールと利用方法 2023/04/18
- ts-jest が esbuild/swc をトランスフォーマーに使って高速化していた 2023/04/13
- aws-sdk v3 を使うライブラリを作ったときは、なるべく peerDependencies に設定しよう 2023/04/11
- aws-sdk v2 が 2023 年中にメンテナンスモードになる 2023/04/06
- Node.js v18 / aws-sdk v3 の Lambda アプリが突然動かなくなる 2023/04/05