Ground Sunlight

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

ユーザ用ツール

サイト用ツール


apricot:ext:middleware

差分

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

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

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
apricot:ext:middleware [2020/05/23 16:45]
y2sunlight [Apricot ミドルウェア]
apricot:ext:middleware [2020/06/08 16:18] (現在)
tanaka [Apricot ミドルウェア]
行 13: 行 13:
     * [[apricot:ext:access-log|Apricot アクセスログ]]     * [[apricot:ext:access-log|Apricot アクセスログ]]
     * [[apricot:ext:csrf|Apricot CSRF対策]]     * [[apricot:ext:csrf|Apricot CSRF対策]]
-    * [[apricot:ext:user-auth|Apricot ユーザ認証の準備]]+    * [[apricot:ext:user-auth|Apricot ユーザ認証]]
     * [[apricot:ext:basic-auth|Apricot 基本認証]]     * [[apricot:ext:basic-auth|Apricot 基本認証]]
     * [[apricot:ext:session-auth|Apricot セッション認証]]     * [[apricot:ext:session-auth|Apricot セッション認証]]
行 22: 行 22:
  
 === ミドルウェア構造 === === ミドルウェア構造 ===
-<code> +{{:apricot:ext:ext-fig01.svg?nolink&800}}
-                   Middleware(A)       Middleware(B)        Action +
-                  ┌────────────┐      ┌────────────┐      ┌────────┐ +
-  [Request ] ---> | ---------> | ---> | ---------> | ---> | ───┐   |  +
-                  |     ↓      |      |     ↓      |      |    |   |  +
-  [Response] <--- | <--------  | <--- | <--------- | <--- | <──┘   |  +
-                  └────────────┘      └────────────┘      └────────┘ +
-</code>+
  
 上図のような処理のネスト構造を ''パイプライン'' (pipeline) と呼び、特に多層になったミドルウェア構造を ''ミドルウェアパイプライン'' と呼ぶ事にします。 上図のような処理のネスト構造を ''パイプライン'' (pipeline) と呼び、特に多層になったミドルウェア構造を ''ミドルウェアパイプライン'' と呼ぶ事にします。
行 225: 行 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;
行 331: 行 324:
   * MiddlewarePipeline クラスの executeAction() メソッドの戻り値が Responseインスタンスだった時は、commit()メソッドを実行してクライアントにレスポンスを返します。   * MiddlewarePipeline クラスの executeAction() メソッドの戻り値が Responseインスタンスだった時は、commit()メソッドを実行してクライアントにレスポンスを返します。
  
 +\\
  
-=== テスト ===+===== テスト実行 =====
  
 ミドルウェアの仕組みはこれで作成出来ました。まだ、具体的なミドルウエアは実装されていませんが、この時点で一度実行してみましょう。 ミドルウェアの仕組みはこれで作成出来ました。まだ、具体的なミドルウエアは実装されていませんが、この時点で一度実行してみましょう。
行 344: 行 338:
 \\ \\
  
- 
-===== アクセスログ ===== 
- 
-ミドルウエアの実装例としてアクセスログを作ってみましょう。アクセスログは一番外側のミドルウェアとして機能させます。パプラインの次の処理の前後でログを取ることもできますが、ここでは、前処理としてログ出力を行います。 
- 
-Apricotでは具体的なミドルウェアの実装はアプリ側の以下のフォルダに保存します。 
-<code> 
-apricot [プロジェクト] 
- | 
- ├── app [アプリケーション] 
-    | 
-    └── Middleware [ルミドルウェア] 
-</code> 
- 
-==== AccessLog ルミドルウェア ==== 
- 
-以下に、アクセスログの実装を示します。 
- 
-{{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> 
- 
-  * [[#Middleware インターフェース|Middleware インターフェース]]の process() メソッドを実装します。 
- 
-  * [[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() メソッドを呼び出します。 
- 
-\\ 
- 
-==== アプリケーション設定の変更 ==== 
- 
-上で作ったミドルウェア(AccessLog)をアプリケーションの設定ファイル(app.php)に追加します。 
- 
-{{fa>folder-open-o}} ** /apricot/config** 
-<code php app.php> 
-<?php 
-return 
-[ 
-    'setup' =>[], 
-    'middleware' =>[ 
-        \App\Middleware\AccessLog::class,        /* Access log */ 
-    ], 
-    'auth' =>[], 
-    'csrf' =>[], 
-]; 
-</code> 
- 
-  * middlewareにクラス( ''\App\Middleware\AccessLog::class'' )を追加します 
- 
-\\ 
- 
-===== テスト実行 ===== 
- 
-アクセスログのテストをしてみましょう。ブラウザ上で以下のURLにアクセスしてみて下さい。 
- 
-<code> 
-http://localhost/ws2019/apricot/public/ 
-</code> 
- 
-以下のアクセスログが出力されていることを確認して下さい。 
- 
-{{fa>folder-open-o}} ** /apricot/var/logs ** 
-<code log apricot-2020-05-21.log> 
- 
-<code> 
-[2020-05-21T15:29:20.941358+09:00] apricot.INFO: 2qqabsldseqabgv9sksejslaic GET /ws2019/apricot/public/home {"remote_addr":"::1","remote_user":"Anonymous","user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36","input":"[]" 
-</code> 
- 
-■ その他の画面を表示してアクセスログを確認して下さい。\\  
-■ 尚、[[apricot:core:basic-class#ロギング|ロギング]]の設定は以下の設定ファイルで行います。\\  
-<div indent> 
-{{fa>file-o}} /apricot/config/setting/monolog.setting.php 
-</div> 
- 
-\\ 
  
apricot/ext/middleware.1590219909.txt.gz · 最終更新: 2020/05/23 16:45 by y2sunlight