Công cụ debugbar không thể thiếu (ok)

https://allaravel.com/blog/huong-dan-cai-dat-va-su-dung-laravel-debugbar

composer require barryvdh/laravel-debugbar --dev

Hướng dẫn cài đặt và sử dụng Laravel Debugbar

64,791 lượt xem 8 bình luận viết bởi FirebirD

Nhược điểm lớn nhất khi lập trình PHP là các IDE chưa hỗ trợ debug tốt như với lập trình .NET sử dụng Microsoft Visual Studio, cũng chính vì thế cộng đồng PHP luôn tìm cách phát triển ra các công cụ debug thật tốt, PHP Debug Bar là một trong những công cụ như thế. Nó giúp cho việc debug một ứng dụng PHP không còn là ác mộng. Laravel Debugbar là một gói phần mềm giúp tích hợp PHP Debug Bar vào framework Laravel. Sau khi cài đặt Laravel Debugbar, vào mỗi trang của website bạn sẽ thấy có một thanh công cụ ở phía dưới cùng, nó chứa rất nhiều các thông tin hữu ích cho việc kiểm tra lỗi ứng dụng.

Laravel Debugbar: tìm bọ thật đơn giản :)

1. Cài đặt Laravel Debugbar

Bạn có thể cài đặt Laravel Debugbar vào project Laravel thông qua công cụ Composer với câu lệnh composer require barryvdh/laravel-debugbar:

Admin@ADMIN-PC c:\xampp\htdocs\allaravel.com
$ composer require barryvdh/laravel-debugbar
Using version ^2.4 for barryvdh/laravel-debugbar
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 2 installs, 0 updates, 0 removals
  - Installing maximebf/debugbar (1.13.1): Loading from cache
  - Installing barryvdh/laravel-debugbar (v2.4.1): Downloading (100%)
maximebf/debugbar suggests installing kriswallsmith/assetic (The best way to manage assets)
maximebf/debugbar suggests installing predis/predis (Redis storage)
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postUpdate
> php artisan optimize
Generating optimized class loader
The compiled services file has been removed.

Tiếp theo đăng ký ServiceProvider và Facade cho Laravel Debugbar trong file config/app.php:

'providers' => [
    ...
    Barryvdh\Debugbar\ServiceProvider::class,
    ...
],
'aliases' => [
    ...
    'Debugbar' => Barryvdh\Debugbar\Facade::class,
    ...
],

Chú ý, với phiên bản Laravel từ 5.5 trở lên, không cần bước đăng ký ServiceProvider và Facade do các phiên bản mới có tính năng tự động kiểm tra và đăng ký. Mặc định Laravel Debugbar ở chế độ hoạt động nếu thiết lập trong config/app.php với thuộc tính debug là true.

'debug' => env('APP_DEBUG', true),

Laravel Debugbar cũng có file config riêng, nếu bạn không muốn dùng chung cấu hình app.debug. Thực hiện copy file config từ trong gói barryvdh/laravel-debugbar vào thư mục config của dự án bằng lệnh artisan vendor:publish.

Admin@ADMIN-PC c:\xampp\htdocs\allaravel.com
$ php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"
Publishing complete.

và có thể thay đổi chế độ bật tắt của Laravel Debugbar trong config\debugbar.php:

<?php
return [
    /*
     |--------------------------------------------------------------------------
     | Debugbar Settings
     |--------------------------------------------------------------------------
     |
     | Debugbar is enabled by default, when debug is set to true in app.php.
     | You can override the value by setting enable to true or false instead of null.
     |
     */
    'enabled' => env('DEBUGBAR_ENABLED', null),

Ghi nhớ:

Chỉ nên để Laravel Debugbar ở chế độ hoạt động khi phát triển ứng dụng, nó có thể làm chậm ứng dụng đi do phải thu thập rất nhiều thông tin phục vụ cho việc debug. Nếu bạn thấy Laravel Debugbar hoạt động quá chậm bạn có thể tắt bớt một số các Collector đi, xem phần tiếp theo để biết thêm chi tiết.

2. Sử dụng Laravel Debugbar

Sau bước cài đặt ở trên, vào bất kỳ trang nào của project bạn cũng sẽ thấy thanh Laravel Debugbar xuất hiện ở cuối trang.

Trên thanh Debugbar có rất nhiều các nhóm thông tin như Messages, Timeline, Exceptions, Views... Mỗi nhóm thông tin này sẽ do một Collector đảm nhận thu thập dữ liệu. Laravel Debugbar có những collector sau:

  • QueryCollector: Thu thập thông tin về các truy vấn cơ sở dữ liệu.

  • RouteCollector: Thông tin về các route trong hệ thống.

  • ViewCollector: Thông tin về các view được tải.

  • EventsCollector: Thông tin về các sự kiện trong Laravel.

  • LaravelCollector: Thông tin về phiên bản Laravel và môi trường đang sử dụng (mặc định tắt).

  • SymfonyRequestCollector: thay thế cho RequestCollector với nhiều thông tin hơn về các request và response

  • LogsCollector: Thông tin và các log được lưu trong thư mục logs (mặc định tắt)

  • FilesCollector: Thông tin về các file được included hoặc required bởi PHP. (mặc định tắt)

  • ConfigCollector: Thông tin về các file cấu hình trong thư mục config (mặc định tắt)

Các collector của bên thứ ba:

  • LogCollector: Thông tin các log message.

  • SwiftMailCollector và SwiftLogCollector: Thông tin về xử lý email trong Laravel.

Các collector mặc định của PHP Debug Bar:

  • PhpInfoCollector

  • MessagesCollector

  • TimeDataCollector

  • MemoryCollector

  • ExceptionsCollector

Laravel Debugbar sẽ làm cho ứng dụng hoạt động chậm đi do phải thu thập rất nhiều các thông tin khác nhau, nếu các nhóm thông tin nào bạn thấy không cần thiết có thể tắt bớt các Collector đi bằng cách thiết lập trong file config\debugbar.php:

/*
     |--------------------------------------------------------------------------
     | DataCollectors
     |--------------------------------------------------------------------------
     |
     | Enable/disable DataCollectors
     |
     */
    'collectors' => [
        'phpinfo'         => true,  // Php version
        'messages'        => true,  // Messages
        'time'            => true,  // Time Datalogger
        'memory'          => true,  // Memory usage
        'exceptions'      => true,  // Exception displayer
        'log'             => true,  // Logs from Monolog (merged in messages if enabled)
        'db'              => true,  // Show database (PDO) queries and bindings
        'views'           => true,  // Views with their data
        'route'           => true,  // Current route information
        'auth'            => true, // Display Laravel authentication status
        'gate'            => true, // Display Laravel Gate checks
        'session'         => true,  // Display session data
        'symfony_request' => true,  // Only one can be enabled..
        'mail'            => true,  // Catch mail messages
        'laravel'         => false, // Laravel version and environment
        'events'          => false, // All events fired
        'default_request' => false, // Regular or special Symfony request logger
        'logs'            => false, // Add the latest log messages
        'files'           => false, // Show the included files
        'config'          => false, // Display config settings
    ],

3. Gọi Laravel Debugbar trong code

Với thanh Debugbar bạn đã có rất nhiều thông tin cho việc debug, tuy nhiên Laravel Debugbar còn cho phép bạn sử dụng Facade Debugbar để thực hiện nhiều điều hơn nữa.

3.1 Hiển thị message trong Laravel Debugbar

Phần đầu tiên trong thanh Debugbar là Message, bạn có thể hiển thị các message trong này với các tình huống khác nhau để hiển thị các thông tin cần thiết:

Route::get('/', function () {
    $user = App\User::where('email', 'kiendang@allaravel.com')->toSql();
    Debugbar::info($user);
    Debugbar::error('Test Debugbar error message');
    Debugbar::warning('Test Debugbar warning message');
    Debugbar::addMessage('Another message', 'mylabel');
    return view('welcome');
});

Khi đó trong phần Message của thanh Debugbar bạn sẽ thấy các thông tin:

3.2 Hiển thị thời gian thực hiện một hành động trong Laravel Debugbar

Có 3 cách khác nhau để hiển thị thời gian thực hiện một hành động trong code.

Cách 1: Nhóm đoạn code cần đo thời gian thực hiện vào Debugbar::startMeasure() và Debugbar::stopMeasure(), ví dụ:

// Bắt đầu đo thời gian truy vấn
Debugbar::startMeasure('query_time','Thời gian thực hiện truy vấn');
$user = App\User::where('email', 'kiendang@allaravel.com')->get();
// Kết thúc đo thời gian truy vấn
Debugbar::stopMeasure('query_time');

Cách 2: Sử dụng phương thức addMeasure():

$start_query = microtime(true);
$user = App\User::where('email', 'kiendang@allaravel.com')->get();
$end_query = microtime(true); 
Debugbar::addMeasure('Thời gian thực hiện truy vấn', $start_query, $end_query);

Cách 3: Khai báo hàm Closure với phương thức measure():

Debugbar::measure('Thời gian thực hiện truy vấn', function() {
    $user = App\User::where('email', 'kiendang@allaravel.com')->get();
});

Kết quả khi bạn vào trang web này bạn sẽ thấy trong phần Timeline của Laravel Debugbar hiển thị như sau:

Cả ba cách trên đều cho ra cùng một kết quả, tuy nhiên có thể áp dụng các cách khai báo khác nhau tùy thuộc từng trường hợp cụ thể. Ví dụ: Để xác định thời gian từ lúc ứng dụng start đến hiện tại ta có thể sử dụng cách thứ 2 đơn giản như sau:

Debugbar::addMeasure('Time from Laravel start to now', LARAVEL_START, microtime(true));

Với LARAVEL_START là một hằng số được định nghĩa trong bootstrap/autoload.php:

define('LARAVEL_START', microtime(true));

Chứa thời gian khi ứng dụng Laravel bắt đầu thực hiện tính bằng micro giây.

3.3 Hiển thị exception trong Laravel Debugbar

Đôi khi chúng ta muốn hiển thị thông tin một Exception trong Debugbar:

try {
    throw new Exception('Error when processing...');
} catch (Exception $e) {
    Debugbar::addThrowable($e);
}

3.4 Hiển thị câu truy vấn trong Laravel Debugbar

Laravel Debugbar có thể bắt được các câu truy vấn bạn xây dựng bằng Eloquent Model hoặc Query Builder, các thông tin này là rất cần thiết khi bạn muốn debug các câu truy vấn phức tạp.

Route::get('/', function () {
    $user = App\User::where('email', 'kiendang@allaravel.com')
        ->orWhere(function($query){
            $query->where('email', 'like', '%allaravel.com')
                ->where('name', 'like', 'Admin%');
        })
    ->get();
    return view('welcome');
});

Khi bạn vào trang web và vào phần Queries bạn sẽ thấy câu truy vấn cuối cùng được Laravel sinh ra để thực hiện truy vấn cơ sở dữ liệu, nó đầy đủ cả các thông tin nhập vào.

3.5 Các thông tin liên quan đến framework Laravel trong Laravel Debugbar

Ngoài các thông tin chung, Laravel Debugbar còn có các thông tin thu thập với các thành phần trong framework Laravel như View, Route, Session, Request.

3.5.1 Views

Phần thông tin Views trong Laravel Debugbar chứa các thông tin về các Blade template được sử dụng để render ra trang web hiện tại, khi click vào từng view bạn sẽ thấy một bảng chứa các tham số được truyền cho view đó.

3.5.2 Route

Thông tin Route trong Laravel Debugbar bao gồm phương thức của Controller nào được sử dụng để xử lý cho route hiện hành, thông tin về prefix, alias, thông tin về Middleware nào được sử dụng.

3.5.3 Request

Các thông tin về Request cũng được hiển thị trong Laravel Debugbar bao gồm mã trạng thái, request header, loại nội dung.

3.6 Bật tắt chế độ hoạt động Laravel Debugbar trong ứng dụng

Debugbar có thể bật tắt thông qua các tham số như app.debug (nếu config\debugbar.php không tồn tại) hoặc debugbar.enable. Tuy nhiên, chúng ta muốn đưa chức năng bật tắt này vào trong ứng dụng, thực hiện bằng cách gọi đến các phương thức enable và disable:

Debugbar::enable();
Debugbar::disable();

Cũng có thể bạn muốn chỉ có người dùng có quyền quản trị mới thấy Laravel Debugbar khi Debugbar đã được bật, các user khác duyệt trang vẫn bình thường? Bạn hoàn toàn có thể thực hiện được. Mặc định Laravel Debugbar được chèn vào trước thẻ kết thúc . Bạn thiết lập cấu hình mặc định này thành false trong thành phần inject của file config\debugbar.php:

    /*
     |--------------------------------------------------------------------------
     | Inject Debugbar in Response
     |--------------------------------------------------------------------------
     |
     | Usually, the debugbar is added just before </body>, by listening to the
     | Response after the App is done. If you disable this, you have to add them
     | in your template yourself. See http://phpdebugbar.com/docs/rendering.html
     |
     */

    'inject' => false,

Khi đó, ở đâu cần thanh debugbar bạn sử dụng phương thức Debugbar::getJavascriptRenderer():

if(is_admin($user)) {
    $renderer = Debugbar::getJavascriptRenderer();
}

4. Lời kết

Với công cụ Laravel Debugbar bạn đã có một công cụ debug khá tốt, tuy không thể sánh được với các công cụ như Microsoft Visual Studio cho lập trình .Net nhưng như vầy cũng là quá đủ thông tin để chúng ta thực hiện kiểm tra lỗi nhanh chóng hơn so với sử dụng các phương thức cổ điển như in ra các biến cần xem hoặc sử dụng helper function dd(). Hi vọng trong thời gian không xa, các lập trình viên Laravel nói riêng và lập trình viên PHP nói chung sẽ có một công cụ mạnh mẽ cỡ như Visual Studio. Hehe ai cấm mình mơ ước đâu bạn nhỉ?

Last updated