Một số tip debug trong Laravel
Người viết: Hoàng Nguyễn Xin chào anh em, cũng lâu lâu mình cũng chưa viết bài chia sẻ. Trong bài này mình muốn chia sẻ cho các bạn về các tip debug trong Laravel nhé. Như các bạn biết đấy, khi chúng ta code thì hầu hết đa phần chúng ta không thể nào code đúng ngay được, có khi gặp ...
Người viết: Hoàng Nguyễn
Xin chào anh em, cũng lâu lâu mình cũng chưa viết bài chia sẻ. Trong bài này mình muốn chia sẻ cho các bạn về các tip debug trong Laravel nhé. Như các bạn biết đấy, khi chúng ta code thì hầu hết đa phần chúng ta không thể nào code đúng ngay được, có khi gặp những lỗi mình không biết nó từ đâu sinh ra.
Xem thêm Debug là gì
Vì vậy, việc debug rất quan trọng khi chúng ta lập trình. Trong bài viết này, mình sẽ giới thiệu các bạn cách sử dụng một số công cụ hỗ trợ việc phát triển và debug trong Laravel 5 nhé.
Đầu tiên chúng ta sẽ tải project mới về bằng composer nhé:
1 2 3 |
composer create-project --prefer-dist laravel/laravel demo_laravel_scout |
Sau đó chúng ta vào file .env để config database:
1 2 3 4 5 6 7 8 |
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=test DB_USERNAME=root DB_PASSWORD= |
Chúng ta sẽ thực thi câu lệnh php artisan migrate để nó migration các bảng có sẵn nhé để chúng ta dùng. Sau đó mình fake dữ liệu bằng cách sau:
1 2 3 4 5 |
php artisan tinker factory(AppUser::class, 100)->create(); |
Sau đó chúng ta tạo UserController nhé. Xong phần set up cái project mẫu để chúng ta có thể sử dụng các tip debug dưới đây thông qua ví dụ nhé.
Hàm dd()
Hàm này được dùng trong việc muốn xem xem kết quả trả ra là cái gì. Nó được dùng để phục vụ cho việc bạn muốn xem đầu ra của dữ liệu. Chúng ta thường xuyên sau khi query xong nó trả về cái gì, liệu nó là Collection hay Eloquent, hay là một mảng dữ liệu gì đó.
Nhiều khi các bạn sử dụng thư viện Transformer để trả về kiểu dữ liệu theo một quy chuẩn nào đó… Việc dd() ra dữ liệu đầu ra giúp các bạn dễ dàng trong việc hiển thị kết quả đó ra một cách dễ dàng.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php namespace AppHttpControllers; use IlluminateHttpRequest; use AppUser; class UserController extends Controller { public function index(Request $request) { $users = User::all(); dd($users); return $users; } } |
Bây giờ chúng ta sẽ lấy về tất cả các User nhưng chúng ta không biết kết quả trả về như nào cả thì chúng ta có thể dùng hàm dd() để có thể xem được nó trả về những gì nhé.
Kết quả là như này:Nếu như các bạn muốn xem rõ hơn nữa trong User nó có những thuộc tính gì thì các bạn cứ ấn vào để xem nhé, rất chi tiết.
Hàm var_dump()
Hàm var_dump() cũng tương tự như dd() , nó cũng sẽ in ra thông tin của biến gồm kiểu dữ liệu của biến và giá trị.
Tương tự như vậy mình cũng sẽ thay đổi code như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php namespace AppHttpControllers; use IlluminateHttpRequest; use AppUser; class UserController extends Controller { public function index(Request $request) { $users = User::all(); var_dump($users); return $users; } } |
Một điều đặc biệt các bạn sẽ thấy đó chính là khi gặp hàm var_dump() chương trình của chúng ta không dừng mà vẫn chạy tiếp cho đến đoạn return $users. Vì thế khi muốn dừng thì các bạn phải kết hợp với die() nhé:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php namespace AppHttpControllers; use IlluminateHttpRequest; use AppUser; class UserController extends Controller { public function index(Request $request) { $users = User::all(); var_dump($users); die(); return $users; } } |
Nó sẽ trả ra cho các bạn một chuỗi lằng nhằng để format lại các bạn ấn CTRL + U của trình duyệt chrome nhé, thì nó sẽ ra cho bạn như này nhìn nó dễ nhìn hơn.
print_r()
Hàm print_r() sẽ in biến ra thông tin của biến truyền vào một cách dễ hiểu, nó thường xuyên được kết hợp với thẻ <pre> trong các trường hợp in mảng, đối tượng,…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php namespace AppHttpControllers; use IlluminateHttpRequest; use AppUser; class UserController extends Controller { public function index(Request $request) { $users = User::all(); echo "<pre>"; print_r($users); echo "</pre>"; return $users; } } |
Kết quả hiện thị: Thật dễ dàng phải không các bạn, mình vừa giới thiệu qua một số hàm của PHP rồi. Nối tiếp bài viết, mình sẽ giới thiệu cho các bạn về Laravel Logger nhé.
Laravel Logger
Logging là một tính năng phổ biến, và mặc định Laravel sử dụng Monolog cho việc ghi tất cả log cần thiết, nó là một thư viện phổ biến PHP logging. Một điều mà Monolog mà nó mang lại rất hay là nó cung cấp một interface chung cho chúng ta có thể viết log bất cứ thứ gì, đơn giản là nó ghi ra file log hay đến sử dụng bến những third-party log management services.
Monolog có tính linh hoạt cao, nó có thể gửi lỗi mà được log lại vào file , socket, email, databases và một vài các web service khác nữa. Laravel thường thiết lập Monolog thông qua file cấu hình.
Logging configuration
File config logging sẽ nằm ở thư mục config/logging.php. Đầu tiên chúng ta sẽ thấy 2 phương thức của Monolog được import vào để hỗ trợ việc xử lý cho các channel. Các bạn sẽ thấy từ khóa được return về default và channels.
Các kênh là những nơi nhận nhiệm vụ báo log cho chúng ta.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
return [ /* |-------------------------------------------------------------------------- | Default Log Channel |-------------------------------------------------------------------------- | | This option defines the default log channel that gets used when writing | messages to the logs. The name specified in this option should match | one of the channels defined in the "channels" configuration array. | */ 'default' => env('LOG_CHANNEL', 'stack'), /* |-------------------------------------------------------------------------- | Log Channels |-------------------------------------------------------------------------- | | Here you may configure the log channels for your application. Out of | the box, Laravel uses the Monolog PHP logging library. This gives | you a variety of powerful log handlers / formatters to utilize. | | Available Drivers: "single", "daily", "slack", "syslog", | "errorlog", "monolog", | "custom", "stack" | */ 'channels' => [ 'stack' => [ 'driver' => 'stack', 'channels' => ['daily'], 'ignore_exceptions' => false, ], 'single' => [ 'driver' => 'single', 'path' => storage_path('logs/laravel.log'), 'level' => 'debug', ], 'daily' => [ 'driver' => 'daily', 'path' => storage_path('logs/laravel.log'), 'level' => 'debug', 'days' => 14, ], 'slack' => [ 'driver' => 'slack', 'url' => env('LOG_SLACK_WEBHOOK_URL'), 'username' => 'Laravel Log', 'emoji' => ':boom:', 'level' => 'critical', ], 'papertrail' => [ 'driver' => 'monolog', 'level' => 'debug', 'handler' => SyslogUdpHandler::class, 'handler_with' => [ 'host' => env('PAPERTRAIL_URL'), 'port' => env('PAPERTRAIL_PORT'), ], ], 'stderr' => [ 'driver' => 'monolog', 'handler' => StreamHandler::class, 'formatter' => env('LOG_STDERR_FORMATTER'), 'with' => [ 'stream' => 'php://stderr', ], ], 'syslog' => [ 'driver' => 'syslog', 'level' => 'debug', ], 'errorlog' => [ 'driver' => 'errorlog', 'level' => 'debug', ], ], ]; |
Như các bạn thấy có rất nhiều các kênh đảm nhiệm việc báo log cho người dùng. stack là kênh mặc định để gửi log. Chúng mình sẽ đi tìm hiểu chi tiết hơn về cấu hình các kênh này nhé.
Configuration within each channel
Ứng với mỗi key channel các bạn có thể nhìn thấy một mảng các key khác nhau được sử dụng.
Đầu tiên là drivers:
- single: Viết log vào một single file, mặc định, nó thường được ghi vào storage/logs/laravel.log.
- daily: Ý là nếu cần ghi log thì nó sẽ tạo 1 file mới có ngày tháng năm trong tên file log đó. VD: storage/logs/laravel-2019-09-01.log
- errorlog: Nơi mà lỗi được lưu log nó phụ thuộc vào web server của bạn. Ví dụ bạn dùng nginx thì nới lưu log sẽ là /var/log/nginx/error.log.
- syslog: cái này nó cũng phụ thuộc vào server OS của các bạn.
Đó là 4 driver mà đã có từ phiên bản 5.7 trở về trước, từ phiên bản 5.7 trở đi thì được support thêm một vài driver nữa
- stack: Khi sử dụng driver này tứ là bạn có thể sử dụng nhiều logging channel cùng với nhau. Khi đó bạn phải set thêm key channel với giá trị là một mảng tên các key channel nhé.
- slack: Channel này cho phép bạn gửi log đến the popular social channel. Ví dụ như chúng ta dùng chatwork, chúng ta có thể báo lỗi về tin nhắn cho chúng ta.
- monolog: Đây là khi monolog sử dụng lại chính nó, và khi các bạn sử dụng driver này các bạn sẽ sử dụng các method của chính nó nữa. Các bạn sử dụng nó thông qua từ khóa handler nhé.
Writing log message
Như các bạn biết đấy, chúng ta hoàn toàn có thể ghi log vào trong thư mục storage/logs bằng cách sử dụng facade Log. Nhật ký lỗi được ghi nhận với 8 cấp độ khác nhau theo tiêu chuẩn RFC 5424:
1 2 3 4 5 6 7 8 9 10 |
Log::emergency($message); Log::alert($message); Log::critical($message); Log::error($message); Log::warning($message); Log::notice($message);
Có thể bạn quan tâm
0
|