Laravel Debug Bar 只顯示給admin或指定用戶

事源

有個即將上線的網站是用 Laravel ,因為是有用戶登入的功能,也預計會有不少流量,所以會擔心的效率的問題

barryvdh/laravel-debugbar 是一套非常不錯的工具,在開發期很大幫助,可看到每個頁面的sql view route等一切資訊,但上線後怎麼辦?

如果真的是用來debug,其實發現問題時我們在測試server中打開也是ok的,但問題是我認為這套功能重點除了debug反而是改善速度及性能的神器,那是否更加應該在線上真正的server上去做檢視?但又不可能讓所有用戶看到,那麼就應該考慮用middleware去解決了

前期準備,簡易會員系統,用Jetstream為例

有關怎麼做管理員的可參考這2篇文章:

必要:Laravel/Jetstream 試用

非必要: 基於Laravel/Jetstream做一個獨立後台

上面的文章是教你做個簡單的後台,但你都學會用 Jetstream 來做管理員並登入做後台了,那麼Jetstream是全域名通用的,你在網台前台也是有管理員身份的

安裝及設定過程

1.安裝 barryvdh/laravel-debugbar 套件

composer require barryvdh/laravel-debugbar

2. 前往 .env文件新增一項,並設為ture,這一步非常重要

DEBUGBAR_ENABLED=ture

3. 在 config/app.php 找aliases 加入一行

    'aliases' => [
        ...
        'Debugbar' => Barryvdh\Debugbar\Facades\Debugbar::class,
        ...
    ],

4. 建立一個 middleware 中間件

這邊比如我改名叫DebugBar

php artisan make:middleware DebugBar

系統會生成一個 app/Http/Middleware/DebugBar.php

5. 打開編輯 app/Http/Middleware/DebugBar.php

下面是我的參考代碼,你可按你自己理想的限制,給指定的人,甚至是指定的IP,才提供Debug Bar 顯示

<?php

namespace App\Http\Middleware;

use Auth;
use Closure;
use Config; //非必要,順便打開debug mode

class DebugBar {

    public function handle($request, Closure $next, $guard = null) {
        app('debugbar')->disable();  //預設給所有人是關閉的

         //假設管理員的id是1號,也只有一位管理員
        if (Auth::check() && Auth::user()->id == 1) { 
            app('debugbar')->enable();  //如果是管理員將debugbar打開         
            Config::set('app.debug', true); //非必要,順便打開debug mode
        }

        return $next($request);
    }

}

6. 前往 app/Http/Kernel.php,找到middlewareGroups下的web, 加入剛剛新增的middleware

    protected $middlewareGroups = [
        'web' => [
        ......
            \App\Http\Middleware\DebugBar::class,
        .....
        ]

這樣基本上就已設定完成了!! 只有通過了Middleware/DebugBar.php 要求的人才會把debugbar enable

後記:大坑,小心!!

踩坑1

網上看很多教學或youtube的video,在config/app.php那一步都是教我 'Debugbar' => Barryvdh\Debugbar\Facade::class, 那是舊版本的,我上面是使用 "barryvdh/laravel-debugbar": "^3.6",

建議有需要的朋友可去官方看看當前版本是更新到什麼路徑

踩坑2

網上大部分的文章都是說用這兩行做開關,但我試了就是沒有反應

\Debugbar::enable();
\Debugbar::disabled();

上面的設定的確會對 dump(debugbar()->isEnabled()); 改變了顯示false 或true,但實際情況並不會有任何改變,一樣是不顯示 (或者應該說是以 config/app.php 或env的DEBUGBAR_ENABLED 設定為準)

其實到這邊已經想放棄了,直到我看到github上有一個回應指

Any idea on this? I'm in the same situation.

If I set DEBUGBAR_ENABLED to true everything's fine.

But if I set it to false, and then use debugbar()->enable() in the middleware, it doesn't show.

If on the next line I do dump(debugbar()->isEnabled()) it returns true, and dump(debugbar()->getData()) contains everything, but the bar it's not there.

ref: https://github.com/barryvdh/laravel-debugbar/issues/1000#issuecomment-803610562

天啊,原來別人跟我一樣

後來得知原來改用這兩行去做開關就可順利做到想要的效果

    app('debugbar')->enable(); 
    app('debugbar')->disable(); 

補充

這篇的目標群體應該極少,需要的人也不多,我上面後記所說的也很亂

因為其實我感覺當前版本的設定的確有少少不清晰,或者說我自己也沒太深入理解,因為畢竟只是一套dev mode才用的東西,即時我希望網站上線後也實時使用,但也只有我一人使用,所以免強讓他能順利按照我的要求運作就ok了,

請大家見諒,無法解釋為什麼某些地方一定要這樣設定,只是花了我不小時間試出來的成果。