このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
apricot:ext:middleware [2020/05/21 15:46] y2sunlight [テスト実行] |
apricot:ext:middleware [2020/06/08 16:18] tanaka [Apricot ミドルウェア] |
||
---|---|---|---|
行 11: | 行 11: | ||
* Apricot 拡張 | * Apricot 拡張 | ||
* Apricot ミドルウェア | * Apricot ミドルウェア | ||
+ | * [[apricot: | ||
+ | * [[apricot: | ||
* [[apricot: | * [[apricot: | ||
- | * [[apricot: | + | * [[apricot: |
+ | * [[apricot: | ||
* [[apricot: | * [[apricot: | ||
* [[apricot: | * [[apricot: | ||
- | 本章ではミドルウェアを作ります。ミドルウェアとはアクションを囲んでいる層のような存在で、ユーザからのリクエストは何層もあるミドルウェアを通って最終的にアクションにたどり着きそこでレスポンスが生成されますが、途中でリクエストが中断され、ミドルウェアがレスポンスを生成することもあります。これを図示すると以下のようになります。 | + | 本章ではミドルウェア基盤を作ります。ミドルウェアとはアクションを囲んでいる層のような存在で、ユーザからのリクエストは何層もあるミドルウェアを通って最終的にアクションにたどり着きそこでレスポンスが生成されますが、途中でリクエストが中断され、ミドルウェアがレスポンスを生成することもあります。これを図示すると以下のようになります。 |
=== ミドルウェア構造 === | === ミドルウェア構造 === | ||
- | < | + | {{: |
- | | + | |
- | ┌────────────┐ | + | |
- | [Request ] ---> | ---------> | + | |
- | | | + | |
- | [Response] <--- | < | + | |
- | └────────────┘ | + | |
- | </ | + | |
上図のような処理のネスト構造を '' | 上図のような処理のネスト構造を '' | ||
- | 本章では、Apricotにミドルウェアの仕組みを作り、その例としてアクセスログを実装します。Apricotには以下のミドルウェアが実装されています。 | + | Apricotには以下のミドルウェアが実装されています。 |
- | * アクセスログ | + | * [[apricot: |
+ | * [[apricot: | ||
* [[apricot: | * [[apricot: | ||
- | * [[apricot: | ||
ミドルウェアパイプラインを含めたミドルウェアの仕組みはApricotのコアの機能として実装しますが、上記のような具体的なミドルウェアの実装はアプリ側で行います。 | ミドルウェアパイプラインを含めたミドルウェアの仕組みはApricotのコアの機能として実装しますが、上記のような具体的なミドルウェアの実装はアプリ側で行います。 | ||
行 222: | 行 218: | ||
{{fa> | {{fa> | ||
- | <code php MiddlewareInvoker.php> | + | <code php MiddlewarePipeline.php> |
<?php | <?php | ||
namespace Core\Foundation\Middleware; | namespace Core\Foundation\Middleware; | ||
行 328: | 行 324: | ||
* MiddlewarePipeline クラスの executeAction() メソッドの戻り値が Responseインスタンスだった時は、commit()メソッドを実行してクライアントにレスポンスを返します。 | * MiddlewarePipeline クラスの executeAction() メソッドの戻り値が Responseインスタンスだった時は、commit()メソッドを実行してクライアントにレスポンスを返します。 | ||
+ | \\ | ||
- | === テスト === | + | ===== テスト実行 ===== |
ミドルウェアの仕組みはこれで作成出来ました。まだ、具体的なミドルウエアは実装されていませんが、この時点で一度実行してみましょう。 | ミドルウェアの仕組みはこれで作成出来ました。まだ、具体的なミドルウエアは実装されていませんが、この時点で一度実行してみましょう。 | ||
行 341: | 行 338: | ||
\\ | \\ | ||
- | |||
- | ===== アクセスログ ===== | ||
- | |||
- | ミドルウエアの実装例としてアクセスログを作ってみましょう。アクセスログは一番外側のミドルウェアとして機能させます。パプラインの次の処理の前後でログを取ることもできますが、ここでは、前処理としてログ出力を行います。 | ||
- | |||
- | Apricotでは具体的なミドルウェアの実装はアプリ側の以下のフォルダに保存します。 | ||
- | < | ||
- | apricot [プロジェクト] | ||
- | | | ||
- | | ||
- | | ||
- | | ||
- | </ | ||
- | |||
- | ==== AccessLog ルミドルウェア ==== | ||
- | |||
- | 以下に、アクセスログの実装を示します。 | ||
- | |||
- | {{fa> | ||
- | <code php AccessLog.php> | ||
- | namespace App\Middleware; | ||
- | |||
- | use Core\Log; | ||
- | use Core\Input; | ||
- | use Core\Foundation\Response; | ||
- | use Core\Foundation\Invoker; | ||
- | use Core\Foundation\Middleware\Middleware; | ||
- | |||
- | /** | ||
- | * アクセスログ - Middleware | ||
- | */ | ||
- | class AccessLog implements Middleware | ||
- | { | ||
- | /** | ||
- | * Process incoming requests and produces a response | ||
- | * {@inheritDoc} | ||
- | * @see \Core\Foundation\Middleware\Middleware:: | ||
- | */ | ||
- | public function process(Invoker $next): Response | ||
- | { | ||
- | $message = session_id().' | ||
- | |||
- | // 前処理 | ||
- | $data = [ | ||
- | ' | ||
- | ' | ||
- | ' | ||
- | ' | ||
- | ]; | ||
- | Log:: | ||
- | |||
- | // 次のInvokerを呼び出す | ||
- | return $next-> | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | * [[apricot: | ||
- | * ログメッセージ | ||
- | * セッションID ( '' | ||
- | * リクエストメソッド ( '' | ||
- | * リクエストURI ( '' | ||
- | * コンテキスト | ||
- | * リモートIPアドレス ( '' | ||
- | * リモートユーザ ( '' | ||
- | * ユーザエージェント ( '' | ||
- | * フォームデータ ( '' | ||
- | |||
- | * 前処理の後、次の Invoker の invoke() メソッドを呼び出します。 | ||
- | |||
- | \\ | ||
- | |||
- | ==== アプリケーション設定の変更 ==== | ||
- | |||
- | 上で作ったミドルウェア(AccessLog)をアプリケーションの設定ファイル(app.php)に追加します。 | ||
- | |||
- | {{fa> | ||
- | <code php app.php> | ||
- | <?php | ||
- | return | ||
- | [ | ||
- | ' | ||
- | ' | ||
- | \App\Middleware\AccessLog:: | ||
- | ], | ||
- | ' | ||
- | ' | ||
- | ]; | ||
- | </ | ||
- | |||
- | * middlewareにクラス( '' | ||
- | |||
- | \\ | ||
- | |||
- | ===== テスト実行 ===== | ||
- | |||
- | アクセスログのテストをしてみましょう。ブラウザ上で以下のURLにアクセスしてみて下さい。 | ||
- | |||
- | < | ||
- | http:// | ||
- | </ | ||
- | |||
- | 以下のアクセスログが出力されていることを確認して下さい。 | ||
- | |||
- | {{fa> | ||
- | <code log apricot-2020-05-21.log> | ||
- | |||
- | < | ||
- | [2020-05-21T15: | ||
- | </ | ||
- | |||
- | ■ その他の画面を表示してアクセスログを確認して下さい。\\ | ||
- | ■ 尚、[[apricot: | ||
- | <div indent> | ||
- | {{fa> | ||
- | </ | ||
- | |||
- | \\ | ||