事源
有個即將上線的網站是用 Laravel ,因為是有用戶登入的功能,也預計會有不少流量,所以會擔心的效率的問題
barryvdh/laravel-debugbar 是一套非常不錯的工具,在開發期很大幫助,可看到每個頁面的sql view route等一切資訊,但上線後怎麼辦?
如果真的是用來debug,其實發現問題時我們在測試server中打開也是ok的,但問題是我認為這套功能重點除了debug反而是改善速度及性能的神器,那是否更加應該在線上真正的server上去做檢視?但又不可能讓所有用戶看到,那麼就應該考慮用middleware
去解決了
前期準備,簡易會員系統,用Jetstream為例
有關怎麼做管理員的可參考這2篇文章:
非必要: 基於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了,
請大家見諒,無法解釋為什麼某些地方一定要這樣設定,只是花了我不小時間試出來的成果。