[Larave11] Laravel debugbar 限制條件顯示

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

Laravel debug 只向指定用戶/指定IP 顯示

有關Laravel debug 之前寫過2篇有關的記錄,在Larave11, 因為middleware 更換了位置,我重新分享一下,此版本亦都是最人性化的設定

前題假設你已經用了用戶登入的套件等等,我是用 Laravel-jetstream

安裝

方法1

composer require barryvdh/laravel-debugbar

方法2 如果你想只安裝在開發期, 實際線上 營運環境不使用, 可以這樣安裝

composer require barryvdh/laravel-debugbar --dev

如果你是使用本文章以方法1, 繼續進行以下的設定

建立 Middleware

 php artisan make:middleware DebugbarMiddleware

編輯 DebugbarMiddleware

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Barryvdh\Debugbar\Facades\Debugbar;

class DebugbarMiddleware
{
    public function handle(Request $request, Closure $next)
    {
        Debugbar::disable();

        if ($request->hasSession() && Auth::check() && Auth::user()->debug == 1) { 

            Debugbar::enable();
        }

        return $next($request);
    }
} 

這邊我假設在User Model 中加入了名為 debug 的欄位,只在1的時候才會顯示

DebugbarMiddleware 加入 bootstrap/app.php

bootstrap/app.php 找到 withMiddleware$middleware->group('web')加入2行


use Illuminate\Foundation\Configuration\Middleware;  //加入此行

        .....

    ->withMiddleware(function (Middleware $middleware) {

        $middleware->web([
        \Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance::class,
            \Illuminate\Cookie\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \Illuminate\Foundation\Http\Middleware\VerifyCsrfToken::class,
            \App\Http\Middleware\DebugbarMiddleware::class,   //加入此行
        ]);
    })

    ->withExceptions(function (Exceptions $exceptions) {
        $exceptions->render(function (\Symfony\Component\HttpKernel\Exception\NotFoundHttpException $e) {
            \Barryvdh\Debugbar\Facades\Debugbar::disable();
            if (class_exists('\Barryvdh\Debugbar\Facades\Debugbar')) {
                \Barryvdh\Debugbar\Facades\Debugbar::clear();
            }            
            return null;
        });
    })->create();

此處只加入DebugbarMiddleware 可能有問題,因為一旦用了 $middleware->group('web', []); 就會 覆蓋系統原有的引入,所以需要把系統原有的引入都在寫一次

withExceptions()加入這一段,是為了不在404頁面顯示,否則只要去了404頁面是一定會顯示debug的

用處

為什麼線上版也要用debug? 因為效率檢查,其實在本地開發期我很少用到,因為運作快慢可能因開發環境影響,不太會在意。但是線上運作版本我們需要真實知道效率問題,所以反而在線上版我用得更多。但不喜歡終是開開關關的,所以用Middleware去做設定。 以往甚至會用Auth::user()->id==1 去判斷是否打開debug,但我發現如果有足夠複雜的情況我有時想要以用戶角度去測試效率,終不可能一直去改php更換ID吧? 所以在用戶數據庫中加入 debug 一欄去判斷是否打開Laravel debugbar,如果後台有編輯用戶的頁面,直接可在網頁中打開或關閉,連數據庫也不用進入。暫時是我最理想的流程。