Ground Sunlight

Windowsで作る - PHPプログラミングの開発環境

ユーザ用ツール

サイト用ツール


apricot:ext:middleware

差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
apricot:ext:middleware [2020/05/21 15:21]
y2sunlight
apricot:ext:middleware [2020/06/08 16:18] (現在)
tanaka [Apricot ミドルウェア]
行 11: 行 11:
   * Apricot 拡張   * Apricot 拡張
     * Apricot ミドルウェア     * Apricot ミドルウェア
 +    * [[apricot:ext:access-log|Apricot アクセスログ]]
 +    * [[apricot:ext:csrf|Apricot CSRF対策]]
     * [[apricot:ext:user-auth|Apricot ユーザ認証]]     * [[apricot:ext:user-auth|Apricot ユーザ認証]]
-    * [[apricot:ext:csrf|Apricot CSRF対策]]+    * [[apricot:ext:basic-auth|Apricot 基本認証]] 
 +    * [[apricot:ext:session-auth|Apricot セッション認証]]
     * [[apricot:ext:interceptor|Apricot インターセプター]]     * [[apricot:ext:interceptor|Apricot インターセプター]]
     * [[apricot:ext:di-container|Apricot DIコンテナー]]     * [[apricot:ext:di-container|Apricot DIコンテナー]]
  
-本章ではミドルウェアを作ります。ミドルウェアとはアクションを囲んでいる層のような存在で、ユーザからのリクエストは何層もあるミドルウェアを通って最終的にアクションにたどり着きそこでレスポンスが生成されますが、途中でリクエストが中断され、ミドルウェアがレスポンスを生成することもあります。これを図示すると以下のようになります。+本章ではミドルウェア基盤を作ります。ミドルウェアとはアクションを囲んでいる層のような存在で、ユーザからのリクエストは何層もあるミドルウェアを通って最終的にアクションにたどり着きそこでレスポンスが生成されますが、途中でリクエストが中断され、ミドルウェアがレスポンスを生成することもあります。これを図示すると以下のようになります。
  
 === ミドルウェア構造 === === ミドルウェア構造 ===
-<code> +{{:apricot:ext:ext-fig01.svg?nolink&800}}
-                   Middleware(A)       Middleware(B)        Action +
-                  ┌────────────┐      ┌────────────┐      ┌────────┐ +
-  [Request ] ---> | ---------> | ---> | ---------> | ---> | ───┐   |  +
-                  |     ↓      |      |     ↓      |      |    |   |  +
-  [Response] <--- | <--------  | <--- | <--------- | <--- | <──┘   |  +
-                  └────────────┘      └────────────┘      └────────┘ +
-</code>+
  
 上図のような処理のネスト構造を ''パイプライン'' (pipeline) と呼び、特に多層になったミドルウェア構造を ''ミドルウェアパイプライン'' と呼ぶ事にします。 上図のような処理のネスト構造を ''パイプライン'' (pipeline) と呼び、特に多層になったミドルウェア構造を ''ミドルウェアパイプライン'' と呼ぶ事にします。
  
-本章では、Apricotにミドルウェアの仕組みを作り、その例としてアクセスログを実装します。Apricotには以下のミドルウェアが実装されています。+Apricotには以下のミドルウェアが実装されています。
  
-  * アクセスログ+  * [[apricot:ext:access-log|アクセスログ]] 
 +  * [[apricot:ext:csrf|CSRF対策]]
   * [[apricot:ext:user-auth|ユーザ認証]]   * [[apricot:ext:user-auth|ユーザ認証]]
-  * [[apricot:ext:csrf|CSRF対策]] 
  
 ミドルウェアパイプラインを含めたミドルウェアの仕組みはApricotのコアの機能として実装しますが、上記のような具体的なミドルウェアの実装はアプリ側で行います。 ミドルウェアパイプラインを含めたミドルウェアの仕組みはApricotのコアの機能として実装しますが、上記のような具体的なミドルウェアの実装はアプリ側で行います。
行 222: 行 218:
  
 {{fa>folder-open-o}} ** /apricot/core/Foundation/Middleware ** {{fa>folder-open-o}} ** /apricot/core/Foundation/Middleware **
-<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では具体的なミドルウェアの実装はアプリ側の以下のフォルダに保存します。 
-<code> 
-apricot [プロジェクト] 
- | 
- ├── app [アプリケーション] 
-    | 
-    └── Middleware [ルミドルウェア] 
-</code> 
- 
-以下に、アクセスログの実装を示します。 
- 
-{{fa>folder-open-o}} ** /apricot/app/Middleware ** 
-<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::invoke() 
-     */ 
-    public function process(Invoker $next): Response 
-    { 
-        $message = session_id().' '.$_SERVER['REQUEST_METHOD'].' '.$_SERVER['REQUEST_URI']; 
- 
-        // 前処理 
-        $data = [ 
-            'remote_addr' => $_SERVER['REMOTE_ADDR'], 
-            'remote_user' => array_key_exists('REMOTE_USER', $_SERVER) ?$_SERVER['REMOTE_USER'] : 'Anonymous', 
-            'user_agent' =>  $_SERVER['HTTP_USER_AGENT'], 
-            'input' => json_encode(Input::all()), 
-        ]; 
-        Log::info("$message",$data); 
- 
-        // 次のInvokerを呼び出す 
-        return $next->invoke(); 
-    } 
-} 
-</code> 
- 
-  * [[apricot:core:basic-class#ロギングLog::info()]] メソッドでアクセスログを出力します。 
-    * ログメッセージ 
-      * セッションID ( ''session_id()'' ) 
-      * リクエストメソッド ( ''$_SERVER['REQUEST_METHOD']'' ) 
-      * リクエストURI ( ''$_SERVER['REQUEST_URI']'' ) 
-    * コンテキスト 
-      * リモートIPアドレス ( ''$_SERVER['REMOTE_ADDR']'' ) 
-      * リモートユーザ ( ''$_SERVER['REMOTE_USER']'' ) 
-      * ユーザエージェント ( ''$_SERVER['HTTP_USER_AGENT']'' ) 
-      * フォームデータ ( ''Input::all()'' ) 
- 
-  * 前処理の後、次の Invoker の invoke() メソッドを呼び出します。 
- 
-\\ 
- 
-===== テスト実行 ===== 
->TODO 
- 
-\\ 
  
apricot/ext/middleware.1590042068.txt.gz · 最終更新: 2020/05/21 15:21 by y2sunlight