RitoLabo

【PHP】PSR-15 HTTP Handlers(HTTPハンドラ)~HTTPサーバーリクエストハンドラ~

  • 公開:
  • 更新:
  • カテゴリ: PHP PSR
  • タグ: PHP,PSR,PSR-7,PSR-15

PSR-15では、PSR-7以降のPSRで記述されているHTTPメッセージを使用するHTTPサーバーリクエストハンドラ(以下、リクエストハンドラ)とHTTPサーバーミドルウェアコンポーネント(以下、ミドルウェア)の一般的なインターフェイスについて説明します。

HTTPリクエストハンドラは、あらゆるWebアプリケーションの基本的な部分です。 サーバーサイドコードはリクエストメッセージを受信して処理し、レスポンスメッセージを生成します。

HTTPミドルウェアは、共通のリクエストおよびレスポンス処理をアプリケーション層から移動する方法です。

PSR-15で説明するインタフェースは、リクエストハンドラとミドルウェアの抽象です。

「リクエストハンドラー」および「ミドルウェア」への定義はすべて、サーバーリクエスト処理に固有のものです。

アジェンダ
  1. PSR-15について
  2. 仕様
    1. リクエストハンドラ
    2. ミドルウェア
    3. レスポンスの生成
    4. 例外の処理
  3. インターフェイス
    1. RequestHandlerInterface
    2. MiddlewareInterface

PSR-15について

HTTPメッセージ仕様には、リクエストハンドラまたはミドルウェアへの参照が含まれていません。

リクエストハンドラは、あらゆるWebアプリケーションの基本的な部分です。 ハンドラは、リクエストを受信してレスポンスを生成するコンポーネントです。 ほとんどのHTTPメッセージで動作するコードには、何らかのリクエストハンドラがあります。

ミドルウェアはPHPエコシステムに長年にわたって存在しています。 再利用可能なミドルウェアの一般的な概念は、StackPHPによって一般化されました。 PSRとしてのHTTPメッセージのリリース以来、多くのフレームワークでは、HTTPメッセージインターフェイスを使用するミドルウェアが採用されています。

正式なリクエストハンドラとミドルウェアインタフェースに同意すると、いくつかの問題が解消され、多くの利点があります。

  • 開発者がコミットするための正式な標準を提供する。
  • ミドルウェアコンポーネントを互換性のあるフレームワークで実行できるようにする。
  • さまざまなフレームワークによって定義された同様のインターフェイスの重複を排除します。
  • メソッドシグニチャのわずかな不一致を避ける。

PSR-15として定義されるの範囲は以下の通りです。

  • HTTPメッセージを使用するリクエストハンドラインターフェイスを作成する。
  • HTTPメッセージを使用するミドルウェアインターフェイスを作成する。
  • ベストプラクティスに基づいたリクエストハンドラとミドルウェアの署名を実装する。
  • リクエストハンドラとミドルウェアがHTTPメッセージの実装と互換性があることを確認する。

仕様

以下、仕様について記します。

リクエストハンドラ

リクエストハンドラは、PSR-7で定義されているように、リクエストを処理してレスポンスを生成する個々のコンポーネントです。

リクエスト条件がレスポンスを生成できない場合、リクエストハンドラは例外をスローする可能性があります。 例外のタイプは定義されていません。

この標準を使用するリクエストハンドラは、次のインタフェースを実装する必要があります。

Psr\Http\Server\RequestHandlerInterface

ミドルウェア

ミドルウェアコンポーネントは、PSR-7で定義されているように、受信したリクエストの処理と結果のレスポンスの作成に、他のミドルウェアコンポーネントと一緒に参加することが多い個々のコンポーネントです。

ミドルウェアコンポーネントは、十分な条件が満たされていればリクエストハンドラに委譲せずにレスポンスを作成して返すことができます。

この標準を使用するミドルウェアは、次のインタフェースを実装する必要があります。

Psr\Http\Server\MiddlewareInterface

レスポンスの生成

レスポンスを生成するミドルウェアまたはリクエストハンドラは、特定のHTTPメッセージ実装への依存を防ぐために、PSR-7 ResponseInterfaceのプロトタイプを作成するか、ResponseInterfaceインスタンスを生成できるファクトリを作成することをお勧めします。

例外の処理

ミドルウェアを使用するアプリケーションには、例外をキャッチしてレスポンスに変換するコンポーネントが含まれていることが推奨されます。 このミドルウェアは、実行される最初のコンポーネントであり、レスポンスが常に生成されるようにすべての処理をラップする必要があります。

インターフェイス

以下、リクエストハンドラとミドルウェアのインターフェイスについて記します。

RequestHandlerInterface

RequestHandlerInterfaceは、サーバーリクエストを処理し、レスポンスを生成します。

HTTPリクエストハンドラは、HTTPレスポンスを生成するためにHTTPリクエストを処理します。

Psr\Http\Server\RequestHandlerInterface
<?php

namespace Psr\Http\Server;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

interface RequestHandlerInterface
{
public function handle(ServerRequestInterface $request): ResponseInterface;
}

RequestHandlerInterfaceは、リクエストハンドラによって実装される必要があります。

MiddlewareInterface

MiddlewareInterfaceは、サーバーのリクエストとレスポンス処理に参与するインターフェイスです。

HTTPミドルウェアコンポーネントは、HTTPメッセージの処理に参加します。レスポンスを生成する、またはリクエストを後続のミドルウェアに転送し、そのレスポンスに作用することによって、リクエストを処理することができます。

Psr\Http\Server\MiddlewareInterface
<?php

namespace Psr\Http\Server;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

interface MiddlewareInterface
{
public function process(
ServerRequestInterface $request,
RequestHandlerInterface $handler
): ResponseInterface;
}

MiddlewareInterfaceは、互換性のあるミドルウェアコンポーネントによって実装する必要があります。

public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface;

レスポンスを生成するために受信したサーバーリクエストを処理します。

レスポンス自体を生成できない場合は、提供されたリクエストハンドラに委譲してそのリクエストを行うことができます。