在單元測試顯示例外(Show Exception in CLI)

在 Laravel 5 做單元測試時,使用 try catch 丟出例外時,Laravel 5 會自動地將例外的錯誤訊息處理成網頁的樣式呈現,這樣的好處是在網頁中做操作發生例外狀況時,可以直接看到例外的錯誤訊息,但是在寫單元測試 (Unit test) 時,他只會將這些錯誤先記錄在 log 檔案裡面(storage/log/laravel-yyyy-mm-dd.log),我們要看到這些錯誤的狀況必須要再另開終端機去執行 php artisan tail 去觀看這些 例外 Log 的狀況,這樣在做測試的時候是相當麻煩的。

在 Laravel 5 中所有的例外(Exception)都會被丟到 app/Exceptions/Handler.php 中的 render() 去處理

<?php
// app/Exceptions/Handler.php

class Handler extends ExceptionHandler {

    /**
     * Render an exception into an HTTP response.
     * 將例外錯誤轉為 HTTP 回應
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $e
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $e)
    {
        return parent::render($request, $e);
    }

}

我們如果需要在 CLI 就顯示例外錯誤訊息的話,必須修改 render() 函式,而我想要保有原本在網頁做除錯的彈性,所以我在環境變數 .env 檔案中加入例外處理(Exception)顯示的開關,當有設定開啟時,才直接顯示例外訊息。

<!-- .env -->
EXCEPTION_DISPLAY_SWITCH=true

.env 設定好後,就將 render() 函式修改為這樣

<?php
// app/Exceptions/Handler.php

class Handler extends ExceptionHandler {

    /**
     * Render an exception into an HTTP response.
     * 將例外錯誤轉為 HTTP 回應
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $e
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $e)
    {
        // 預設不直接顯示例外訊息
        $exception_display_switch = env('EXCEPTION_DISPLAY_SWITCH', false);

        if ($exception_display_switch) {
            throw $e;
        }

        return parent::render($request, $e);
    }

}

這樣設定完後,也保留原本系統處理例外狀況的彈性,也可以讓我在單元測試(Unit test)中可以正常的去顯示例外訊息了!!

參考資料

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

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

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

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

購書連結

購書連結

results matching ""

    No results matching ""