日誌巨集

前言

我們會用 Laravel 內建的 Response 去回應服務的訊息,我們可能會用的回應會像這樣:

// 建立 JSON 回應
return Response::json(['name' => 'KeJyun', 'Country' => 'Taiwan']);
return response()->json(['name' => 'KeJyun', 'Country' => 'Taiwan']);


// 建立 JSONP 回應
return Response::json(['name' => 'KeJyun', 'Country' => 'Taiwan'])
                 ->setCallback($request->input('callback'));
return response()->json(['name' => 'KeJyun', 'Country' => 'Taiwan'])
                 ->setCallback($request->input('callback'));


// 建立檔案下載的回應
return response()->download($pathToFile);
return response()->download($pathToFile, $name, $headers);
return response()->download($pathToFile)->deleteFileAfterSend(true);

在這樣的使用下,我們可以很容易的回應訊息給使用者,但是在伺服器發生程式例外錯誤 (Exception) 時,我們可能也需要回應像是這樣的資料:

return Response::json(['status' => 'failure', 'error_code' => '5566']);
return response()->json(['status' => 'failure', 'error_code' => '5566']);

在我們用 Laravel 做 API 給手機用的時候,更需要有這些錯誤狀態的資料,所以我們沒辦法直接像網頁一樣跳出整個的錯誤 debug 畫面

但我們若想在 API 回應給手機這樣的錯誤資訊時,也能夠將例外錯誤記錄下來,以便我們進行除錯,我們可以做一個 Response 的巨集,去處理紀錄我們的回應

建立服務提供者

我們在命令列輸入 php artisan make:provider ResponseServiceProvider 建立回應的服務提供者

$ php artisan make:provider ResponseServiceProvider

該服務提供者檔案會被建立在 app/Providers/ResponseServiceProvider.php 中,命名空間為 App\Providers\ResponseServiceProvider

我們不一定要將服務提供者的檔案放到 app/Providers 目錄中,我們可以依照自己專案的需求,將他移動到像是 app/KeJyun/Providers 目錄中,這樣命名空間就會變成 App\KeJyun\Providers\ResponseServiceProvider,檔案放置的位置隨自己專案需求而定,只要遵照 PSR-4 的規定去設定命名空間及檔案位置即可

我新增了一個名稱為 jsonLog 的 Response 巨集,該巨集會回應 json 資料,並依照記錄層級紀錄我們傳給他的資訊,ResponseServiceProvider 程式會像這樣

<?php namespace App\KeJyun\Providers;
// app/KeJyun/Providers/ResponseServiceProvider.php

use Illuminate\Support\ServiceProvider;
use Response, Log;

class ResponseServiceProvider extends ServiceProvider {

    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {

        /**
         *  註冊 Response 記錄錯誤巨集
         *
         *  @param      Array                   $response_data      回傳的 json 資料
         *  @param      Array|Object|String     $log_data           紀錄的資料
         *  @param      String                  $log_level          紀錄資料的等級(預設為 info)
         *
         *  @return     Response                $response           回應的 json 資料
         *
         *  @access     public
         *  @author     KeJyun      kejyun@gmail.com
         *  @date       2015-06-06
         */
        Response::macro('jsonLog', function(
            $response_data,
            $log_data ='No Data Be log!!!',
            $log_level = 'info'
        ) {
            // 增加 Log檔案錯訊息間距以便閱讀
            Log::debug("\n\n\n\n\n");
            Log::debug($response_data);
            Log::debug("\n\n");
            switch ($log_level) {
                case 'debug':
                    Log::debug($log_data);
                    break;
                case 'notice':
                    Log::notice($log_data);
                    break;
                case 'warning':
                    Log::warning($log_data);
                    break;
                case 'error':
                    Log::error($log_data);
                    break;
                case 'critical':
                    Log::critical($log_data);
                    break;
                case 'alert':
                    Log::alert($log_data);
                    break;
                case 'info':
                default:
                    Log::info($log_data);
                    break;
            }

            // 增加 Log檔案錯訊息間距以便閱讀
            Log::debug("\n\n\n\n\n");

            return Response::json($response_data);
        });
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

}

設定服務提供者

設定完自己的 jsonLog 紀錄巨集後,我們需要到 config/app.php 設定這個 Response 服務提供者,我的命名空間為 App\KeJyun\Providers\ResponseServiceProvider,所以設定會像這樣:

// config/app.php

'providers' => [
    // 其他的服務提供者

    'App\KeJyun\Providers\ResponseServiceProvider',
],

設定完之後,Laravel 在啟動時就會自動載入該服務提供者了

使用自定的 Response 巨集 jsonLog

在我們撰寫商業邏輯時若發生無法預期的例外狀況,我們會想要紀錄該例外狀況的資料,我們就可以這樣使用 Response jsonLog 巨集:

try{
  // 商業邏輯處理
} catch (Exception $exception) {
    $response_data = [
        'status'=>'failure',
        'error_code'=>5566,
    ];
    return response()->jsonLog($response_data, $exception, 'alert');
}

這樣在系統發生預期之外的例外時,我們也有參考的資料可以幫我們進行除錯了!!

參考資料

KeJyun 最新新書推薦
- Laravel 5 for beginner 新手道場:優雅運用框架快速開發 PHP 網站
- Laravel框架开发详解:从零基础到运用框架快速开发PHP网站

Laravel 是 PHP 的框架(Framework),提供了很多開發網站或 API 所需的工具及環境,經過簡單的設定就可以完成資料的處理及顯示,使開發者可以很優雅且快速的開發出各個不同的產品。本書適合有 PHP 基礎的人,但不知道要怎麼選擇框架,或者不用框架的人也能夠明白它的好處。

雖然 WordPress 也能夠架站,但如果有客製化需求,要開發各式各樣的網站,或提供 App 使用的 API,如此一來你只能選擇用框架,而 Laravel 是目前最受歡迎的。

本書將解說為什麼要使用框架,以及理解框架的優缺點後,要怎麼選擇框架,並用框架快速建構一個網站。除非必要,否則書中會避免專業技術用語,盡量使用最生活化易懂的例子及語氣,讓大家更容易進入 Laravel 的世界。

Laravel 5 for beginner 新手道場:優雅運用框架快速開發 PHP 網站

購書連結

Laravel框架开发详解:从零基础到运用框架快速开发PHP网站

購書連結

comments powered by Disqus