iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
1

需求
在尚未有任何 GUI畫面或 API Response之前,如果想要知道每一個router路徑到底傳入什麼、輸出了什麼,可透過建立 Before and After Middleware 來實現。

基本指令

php artisan make:middleware apiLog

設定全域的 Middleware

  • Kernel 裡頭最後一個介紹的 protected $middleware 這個設定檔。只要把Middleware放這邊,所有的Router裡面的路徑都會經過,無需再Router裡頭在寫什麼。
  • 寫法會跟$middlewareGroups、$routeMiddleware得不一樣。
protected $middleware = [
    // \App\Http\Middleware\TrustHosts::class,
    \App\Http\Middleware\TrustProxies::class,
    \Fruitcake\Cors\HandleCors::class,
    \App\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    //新增剛剛的
    \App\Http\Middleware\apiLog::class,
];

apiLog設定

class apiLog
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $fromIP = $request->ip();
        $uri = $request->path();
        $method = $request->method();
        $body = $request->all();
        $logResquest = [
            'fromIP: ' => $fromIP,
            'uri: '=> $uri,
            'method: '=>$method,
            'details:'=>$body
        ];
        Log::notice("request ", $logResquest);

        $response = $next($request);
        $body = $response->content();
        $logResponse = [
            'fromIP: ' => $fromIP,
            'uri: '=>$uri,
            'details:'=>$body
        ];
        Log::notice("response ", $logResponse);
        return $response;
    }
}
  • Laravle Request提供HTTP請求的各種屬性,常見的除了取得request body參數之外、ip、path、method都能提供。
  • before and after middleware的差異

    The key difference is in how the $request parameter is handled. If actions are performed before $next($request) that will happen before the controller code is executed while calling $next($request) first will lead to the actions being performed after the controller code is executed

    • 意指 middleware執行內容 以$next($request) 為分界。寫在$next($request)會先執行。寫在之後的會等$request跑完再做。
    • 以code解釋
      public function handle($request, Closure $next)
       {
       // before middleware workspace    
       $response = $next($request);
       // after middleware workspace
       return $response;
       }
      

log檔簡介

  • 一般來說,Log檔位置會位於專案資料夾「 storage/logs 」的路徑下。
  • 紀錄任何controller中有提到 Log::class 的純文字內容。
  • 個人習慣在env 修改為單日紀錄一個檔案。

成果

API 實測
https://ithelp.ithome.com.tw/upload/images/20200929/20125263b3WeRQNDyU.png

log紀錄內容

https://ithelp.ithome.com.tw/upload/images/20200929/20125263iEkQ6eYG1L.png

可看到Log裡頭有request、response的傳輸資訊,這些內容會紀錄超文本傳輸時所轉換的文字格式。


參考資料
https://laravel.tw/docs/5.2/requests
https://ithelp.ithome.com.tw/articles/10208371
https://riptutorial.com/laravel/example/16346/before-vs--after-middleware
https://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE


上一篇
Middleware (1):驗證token
下一篇
RESTful API (1) :Create
系列文
30天開發與部署 Laravel 專案30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言