1. Home
  2. PHP
  3. PSR
  4. 【PHP】PSR-15 HTTP Handlers(HTTPハンドラ)HTTPサーバーリクエストハンドラ

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

  • 公開日
  • 更新日
  • カテゴリ:PSR
  • タグ:PHP,PSR,PSR-7,PSR-15
【PHP】PSR-15 HTTP Handlers(HTTPハンドラ)HTTPサーバーリクエストハンドラ

PSR(PHP 標準勧告)

  1. 概要
  2. PSR-1 Basic Coding Standard
  3. PSR-2 Coding Style Guide
  4. PSR-3 Logger Interface
  5. PSR-4 Autoloader
  6. PSR-6 Caching Interface
  7. PSR-7 HTTP Message Interface
  8. PSR-11 Container Interface
  9. PSR-12 Extended Coding Style
  10. PSR-13 Hypermedia Links
  11. PSR-15 HTTP Handlers
  12. PSR-16 Simple Cache
  13. PSR-17 HTTP Factories
  14. PSR-18 HTTP Client

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

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

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

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

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

Contents

  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;

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

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

Author

rito

  • Backend Engineer
  • Tokyo, Japan
  • PHP 5 技術者認定上級試験 認定者
  • 統計検定 3 級