非常好用的Laravel debug工具,一定要安裝
Chrome/FireFox 都會自帶一些 debug 工具可以幫助我們 debug 前端,如 CSS、JavaScript… 等,但若要 debug 后端的 Laravel 呢? 如有了 ORM 之后雖然方便,但我們可能對其產生的 SQL 有所疑惑,想深入了解其所產生的 SQL 是否符合我們的需求,這些在 Barry vd. Heuvel 的 Laravel Debugbar 都可以滿足我們。
Version
- Laravel 5.1
- Laravel Debugbar 2.0
安裝 Laravel Debugbar
使用 Composer 安裝
oomusou@mac:~/MyProject$ composer require barryvdh/laravel-debugbar --dev
在項目目錄下,使用 composer
將 Laravel debugbar
安裝到當前項目中。
為什么要加上
--dev
參數?
根據 Laravel debugbar
官網的說明文檔,並沒有加上 –dev
,這會使得 Laravel debugbar
被裝在 composer.json
的 require
字段,而非 require-dev
字段,這會造成在正式線上環境也會安裝 Laravel debugbar
,這是不需要的。
composer require
會行完,composer.json
內容會如下所示 :
{
"require": { "php": ">=5.5.9", "laravel/framework": "5.1.*" }, "require-dev": { "fzaninotto/faker": "~1.4", "mockery/mockery": "0.9.*", "phpunit/phpunit": "~4.0", "phpspec/phpspec": "~2.1", "laravel/homestead": "^2.1", "barryvdh/laravel-debugbar": "^2.0" } }
新增 Service Provider
Composer 只是將 Laravel debugbar
安裝到當前項目目錄的 /vendor/barryvdh/laravel-debugbar
目錄下,此時 Laravel 還不知道有這個 package,必須通過 service provider 的注冊加載,Laravel debugbar 才可以使用。
namespace App\Providers; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { // } /** * Register any application services. * * @return void */ public function register() { if ($this->app->environment() == 'local') { $this->app->register('Barryvdh\Debugbar\ServiceProvider'); } } }
這里
public function register() { if ($this->app->environment() == 'local') { $this->app->register('Barryvdh\Debugbar\ServiceProvider'); } }
在 register()
加入以上代碼,只有在本機開發環境時,Laravel debugbar
才會被注冊加載,如此可避免 Laravel debugbar
在正式環境被注冊加載。
為什么不直接寫在 config/app.php 呢?
在 Laravel debugbar
官方的說明文檔,是教人直接在 config/app.php
的 providers
加入 Barryvdh\Debugbar\ServiceProvider::class
,這樣雖然可行,但會導致正式環境也會加載 Laravel debugbar
,雖然 APP_DEBUG=false
可以讓 Laravel debugbar
不會在正式環境加載,但還是會影響 Laravel 啟動時間,比較浪費內存。
設置 Facade
為了方便我們更容易使用 Laravel debugar
顯示變量,建議將 Laravel Debugbar
加入facade。
'aliases' => [ (略) 'Validator' => Illuminate\Support\Facades\Validator::class, 'View' => Illuminate\Support\Facades\View::class, // Laravel Debugbar 'Debugbar' => Barryvdh\Debugbar\Facade::class, ],
下面
// Laravel Debugbar 'Debugbar' => Barryvdh\Debugbar\Facade::class,
加入Debugbar facade。
復制配置文件
oomusou@mac:~/MyProject$ php artisan vendor:publish
將 /vendor/barryvdh/laravel-debugbar/config/debugbar.php
復制到 /config/debugbar.php
,將來你可以直接修改項目下的 /config/debugbar.php
對Laravel Debugbar 進行配置。
確認 .env
APP_ENV=local APP_DEBUG=true
Laravel Debugbar 只有在 APP_ENV=local
並且 APP_DEBUG=true
下才會啟動,確認 .env 配置正確。
測試
在下方會出現 Laravel Debugbar,因為他是純 HTML,所以各種瀏覽器都可使用。
使用Laravel Debugbar
觀察SQL
在 Queris
會顯示目前網頁所執行過的SQL,可由此觀察 ORM 所產生的的SQL是否有調整的空間。
觀察 View
在 Views
會顯示目前網頁正使用了哪些view。
觀察 Route 與 Controller
在 Route 會顯示目前網頁正使用哪個 route 與 controller。
觀察HTTP Request
在 Request 會顯示目前網頁使用 HTTP request 的狀態。
自定義 Debug 信息
業務上我們可以直接將debug 信息顯示在 Laravel Debugbar,這樣就不用使用 echo()
或 dd()
將原本的網頁弄亂了。
Laravel Debugbar 提供了以下方法 :
Debugbar::info($object); Debugbar::error('Error!'); Debugbar::warning('Watch out…');
在 Message 可以看到我們自己的 debug 信息。
使用 Timer 評估效率
業務上我們常會需要自行使用 timer 評估一段算法或SQL的效率,Laravel Debugbar 提供了以下方法 :
Debugbar::startMeasure('render','Time for rendering'); Debugbar::stopMeasure('render'); Debugbar::addMeasure('now', LARAVEL_START, microtime(true)); Debugbar::measure('My long operation', function() { // Do something… });
在 Timeline 可以看到實際執行時間。
Debugbar::addMeasure('now', LARAVEL_START, microtime(true));
Debugbar::addMeasure()
的第1個參數為在 Debugbar 的識別文字,第2個參數為起始時間,第3個參數為結束時間。
下圖為從 Laravel 啟動到目前這個程序所花的時間。
使用 Helper Function
以上方式雖然方便,但還要使用到 Debugbar
facade,Laravel debugbar 另外提供了 helper function,可以更簡單的使用。
// All arguments will be dumped as a debug message debug($var1, $someString, $intValue, $object); start_measure('render','Time for rendering'); stop_measure('render'); add_measure('now', LARAVEL_START, microtime(true)); measure('My long operation', function() { // Do something… });
debug()
可以接受無限參數,每一個參數在Messages
都會獨立一行,屬於 debug 分類。start_measure()
相當於Debugbar::startMeasure()
。stop_measure()
相當於Debugbar::stopMeasure()
。add_measure()
相當於Debugbar::addMeasure()
。measure()
相當於Debugbar::measure()
。
正式環境的安裝考慮
Laravel Debugbar 是開發者的 神兵利器
,但若不小心安裝在正式環境,則成為黑客的最好的 入侵工具
。
使用 –no-dev 安裝
由於 vendor
沒有加入 git 做版本管理,所以勢必在正式環境也要重新安裝 package,在composer install
時,切記要安裝加上 --no-dev
參數,再回顧一下我們的 composer.json
。
"require": { "php": ">=5.5.9", "laravel/framework": "5.1.*" }, "require-dev": { "fzaninotto/faker": "~1.4", "mockery/mockery": "0.9.*", "phpunit/phpunit": "~4.0", "phpspec/phpspec": "~2.1", "laravel/homestead": "^2.1", "barryvdh/laravel-debugbar": "^2.0" },
由於 Laravel debugbar 是放在 require-dev
字段的,因此加上 --no-dev
之后,composer 將不會在正式環境安裝 Laravel debugbar。
APP_DEBUG=false
APP_ENV=production APP_DEBUG=false
切記將 APP_DEBUG=false
,確保 Laravel debugbar 不會在正式環境執行。
Conclusion
- 凡是只有開發者本身在用的 package,都可以模仿這種方式注冊和加載,這樣除了可以避免將 package 安裝到正式環境外,也可加速 Laravel 加載速度,更節省內存。
- Laravel debugbar 是 Laravel 開發必用的 package,對於 debug 非常方便。
- 由於 Laravel debugbar 功能過於強大,在正式環境要特別小心。
Sample Code
完整的例子可以在我的GitHub上找到。