【コンテキストクラス実装】

はじめに

コンテキストクラスは、REST-API サーバー開発環境においてUNIT パラメータグローバル領域の両方の役割を担う重要なクラスです。
イベント処理クラス(イベントハンドラ型/ステートマシン型)から渡される $p_param の正体でもあり、
リクエスト・レスポンス操作、ログ、テンポラリバッファなど、REST-API の実行に必要な機能を集約しています。

このページでは、コンテキストクラスの生成方法、役割、利用例について解説します。

スキャフォールディング(生成方法)

コンテキストクラスは以下のコマンドで生成できます。
php worker custom:context <カスタム名>
                    

生成ファイルは app/ContextClass/<カスタム名>.php に配置されます。
生成されるクラスは ParameterForRestApi を継承した最小構成のクラスで、必要に応じてプロパティやメソッドを追加して利用します。

その他スキャフォールディングの詳細は ▶スキャフォールディング を参照してください。

生成されるクラスの構造

スキャフォールディングで生成されるコンテキストクラスは以下のような内容です。
<?php
/**
* コンテキストクラスのファイル
* 
* UNITパラメータとしての利用と共にグローバル領域としても活用
*/

namespace App\ContextClass;

use App\UnitParameter\ParameterForRestApi;

/**
* コンテキストクラス
* 
* ParameterForRestApiクラスをオーバーライドして利用する
*/
class <カスタム名> extends ParameterForRestApi
{
}
                    

  • ParameterForRestApi を継承することで REST-API サーバーのコンテキストクラスとして認識される
  • 生成されたクラスはメイン処理クラスの $classes['context'] に設定することで適用される(▶メイン処理クラス実装

コンテキストクラスの役割

コンテキストクラスは以下のような用途で利用できます。

  • UNIT 内で利用するパラメータの保持
  • グローバルリソースの管理
  • リクエスト/レスポンス(PSR-7 ラッパー)の操作
  • ログライターの利用
  • クライアントディスクリプタに紐づくテンポラリバッファの管理

なお、特に利用するリソースがない場合はコンテキストクラスを作成する必要はありません。
ParameterForRestApi のままでも REST-API は問題なく動作します。

ユーザーリソースのサンプル

以下はサンプルサーバーで利用されているユーザー管理用のコンテキストクラス例です。
/**
* @var array ユーザー情報
*/
protected array $users = [
    '0' => ['id' => 0, 'name' => 'Taro', 'email' => 'taro@test.co.jp'],
    '1' => ['id' => 1, 'name' => 'Hanako', 'email' => 'hanako@test.co.jp']
];

/**
* ユーザー一覧取得
*/
public function getUserList(?int $p_id = null): array {...}

/**
* 新規ユーザー作成
*/
public function addUser(string $p_name, string $p_email): array {...}

/**
* ユーザー情報更新
*/
public function updateUser(int $p_id, ?string $p_name, ?string $p_email): ?array {...}

/**
* ユーザー削除
*/
public function deleteUser(int $p_id): bool {...}
                    

このように、コンテキストクラスは REST-API の業務ロジックを保持する場所としても活用できます。

ビルトイン機能の継承

新しいコンテキストクラスを作成しても、ParameterForRestApi が持つ以下の機能はそのまま利用できます。

  • PSR-7 ラッパー(リクエスト/レスポンス)
  • logWriter(ログ出力)
  • getTempBuff / setTempBuff(クライアントディスクリプタ単位のデータ管理)
  • setTimeout(非同期タイムアウト)

● アクセス方法の違い

イベント処理クラス内(UNIT 内)では $ctx->logWriter のようにアクセスします。
コンテキストクラス内では $this->logWriter のようにアクセスします。

同じインスタンスを参照しているため、どちらからでも同じリソースを扱えます。

おわりに

コンテキストクラスは REST-API サーバーの実行基盤を支える重要なクラスです。
必要に応じて業務ロジックや共有リソースを追加することで、イベント処理クラスの実装をシンプルに保つことができます。

スキャフォールディングを活用し、プロジェクトに応じた柔軟なコンテキストクラスを設計してください。