Những tính năng cao cấp trong Laravel mà có thể bạn chưa biết – Phần 1

112

Chào các bạn,

Laravel tuy một PHP framework mạnh mẽ khi cung cấp rất nhiều tính năng hay ho cho developer. Nhưng thực tế, nhiều bạn developer mới chỉ sử dụng Laravel như một framework MVC đơn thuần mà không biết rằng ngoài cái đó ra, Laravel còn có nhiều tính năng cao cấp khác.

Vì vậy, trong bài viết này mình sẽ chỉ ra một số tính năng hữu ích khác của Laravel (bên cạnh một MVC framework thuần túy). Hy vọng các bạn sẽ có thêm kiến thức để giải quyết các vấn đề trong dự án tốt hơn.

I. Queue

Queue – Hàng đợi trong Laravel là giải pháp để xử lý các request tốn nhiều thời gian thực thi, trong khi bạn lại không muốn user phải đợi quá lâu mới có response.

Để hiểu rõ hơn, chúng ta sẽ cùng làm một tính năng theo 2 cách, cách 1 không sử dụng queue, cách 2 sử dụng queue để xem sự khác nhau như thế nào nhé:

Xét bài toán như sau:

Xây dựng tính năng đăng ký tài khoản, sau khi đăng ký thành công, sẽ gửi tới email của user một thông báo “Chào mừng bạn đến với website … “, đồng thời hiện một thông báo lên màn hình là “Bạn đã đăng ký thành công“.

Cách 1: Thực hiện mà KHÔNG dùng queue.

Thực hiện mà không sử dụng queue, thì các bước sẽ diễn ra tuần tự như sau:

  • Bước 1: User nhập thông tin đăng ký và nhấn nút “Đăng ký”.
  • Bước 2: Thông tin đăng ký gửi tới Controller để xử lý, thông tin user được lưu vào trong database.
  • Bước 3: Thực hiện gửi mail, và đợi đến khi mail được gửi thành công.
  • Bước 4: In ra màn hình thông báo “Bạn đã đăng ký thành công”.

Cách 2: Thực hiện mà CÓ sử dụng queue.

Các bước sẽ diễn ra như sau:

  • Bước 1: User nhập thông tin đăng ký và nhấn nút “Đăng ký”. (Giống cách 1)
  • Bước 2: Thông tin đăng ký gửi tới Controller để xử lý, thông tin user được lưu vào trong database. (Giống cách 1)
  • Bước 3: Tạo ra một “job gửi email” và đưa vào queue, job này sẽ được chạy sau.
  • Bước 4: In ra màn hình thông báo “Bạn đã đăng ký thành công”. (Giống cách 1)

Nhận xét:

  • Cả hai cách chỉ khác nhau ở bước 3.
  • Cách 1 yêu cầu user phải đợi cho đến khi email được gửi thành công thì mới thực hiện bước 4.
  • Cách 2 thì tạo ra một “job gửi email” và được đưa vào trong queue, job này sẽ chạy sau, nên user không cần phải đợi mà có thể chuyển sang bước 4 ngay.
  • Vì cách 2 không yêu cầu phải đợi, nên cách 2 user sẽ sớm nhận được thông báo “Bạn đã đăng ký thành công“, làm user có trải nghiệm tốt hơn.
  • Job đưa vào trong queue đúng là chạy sau, nhưng nó gần như chạy sau khi user nhận được thông báo “Bạn đã đăng ký thành công hơn“, nên user sẽ vẫn nhận được email ngay sau khi đăng ký.

Mình có một bài viết chi tiết hơn về Queue trong Laravel, bạn có thể tham khảo để hiểu rõ hơn, hoặc đọc tài liệu chính thức của Laravel về queue.

II. Task scheduling

Laravel là PHP framework, mà ứng dụng PHP sẽ chỉ hoạt động khi có request (tức có user truy cập). Nhưng trong thực tế đôi khi sẽ có những yêu cầu mà ứng dụng PHP phải tự nó chạy mà không cần request nào được gửi đến.

Như việc backup dữ liệu vào 12h đêm mỗi ngày chẳng hạn, không lẽ bạn cứ phải căn đúng 12h đêm để vào website, nhấn nút “backup” sao. Thật ra nếu muốn thì bạn cũng có thể làm như vậy, nhưng có cách khác tiện hơn nhiều, đó chính là Task scheduling.

Task scheduling là tính năng cho phép bạn lập lịch chạy một tác vụ nào đó.

Quay trở lại ví dụ backup database ở trên, mình sẽ tạo ra một task mà cứ đúng 12h đêm nó sẽ tự động được chạy, để rồi sáng hôm sau mình sẽ chỉ việc download file database đã được backup về máy, mà không cần phải thức đêm để nhấn nút “backup”.

Cách sử dụng Laravel task scheduling

Laravel task scheduling hoạt động dựa trên crontab, vì thể để sử dụng được tính năng này bạn cần phải cấu hình một cronjob như sau:

Crontab là chương trình lập lịch chạy trên Linux, mỗi một tác vụ được lập lịch chạy được gọi là một cronjob.

Chỉnh sửa crontab:

crontab -e

Thêm vào một cronjob như sau:

* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1

Cronjob trên có ý nghĩa là “Cứ mỗi phút thì thực hiện lệnh cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1 một lần”. Bạn có thể tìm hiểu thêm về cú pháp của Crontab tại đây.

Sau khi cấu hình crontab, giờ bạn có thể cấu hình task scheduling trong file app/Console/Kernel.php.

// app/Console/Kernel.php

// ...

protected function schedule(Schedule $schedule)
{
    $schedule
        ->call(function () {
            // Task làm gì sẽ được định nghĩa ở đây
        })
        // daily() nghĩa là task này sẽ được chạy mỗi ngày ngày.
        // ngoài daily() thì còn nhiều phương thức khác nữa
        // chi tiết tìm hiểu trên docs của Laravel bạn nhé
        ->daily();
}

Về cách khai báo task, cũng như lập lịch task (mỗi ngày, mỗi tuần, chạy lúc mấy giờ,…) thì tài liệu Laravel đã viết rất rõ, nên mình lười không muốn viết lại nữa, bạn có thể đọc thêm ở đây.

III. Compiling assets

Là một PHP framework, nhưng Laravel cũng chú trọng cả frontend, điều này được thể hiện qua tính năng “Compiling assets” (Biên dịch các file assets như scss, js). Ở phiên bản hiện tại (Laravel 8), Laravel thực hiện compiling assets thông qua gói Laravel Mix.

Nếu bạn đã từng sử dụng các tool build frontend như webpack, gulp thì Laravel Mix cũng là cái gì đó tương tự như vậy.

Frontend của các dự án web ngày càng phức tạp, trong khi đó kiểu lập trình web truyền thống thì chưa tập trung nhiều vào tối ưu frontend. Ví dụ, để viết CSS cho website, chúng ta thường tạo một file style.css và nhúng nó vào phần head của trang web. Nhưng khi các trang web ngày càng trở nên phức tạp (ngày càng nhiều trang, ngày càng nhiều css) thì cách làm này dần phát sinh nhiều nhược điểm:

  • File style.css quá nặng.
  • Không tối ưu css: do toàn bộ css đều được viết trong một file, và không phải trang nào cũng sử dụng hết các class được khai báo trong đó, thậm chí có những đoạn css đã không còn dùng tới.
  • Khó quản lý các class: các class mới thì ngày càng được bổ sung, và có thể bị trùng lặp, hoặc xung đột với các class trước đó.

Đứng trước các nhược điểm trên, người ta đã tạo ra các công cụ giúp để tối code frontend, giúp việc code và quản lý các file css, js trở nên đơn giản hơn gấp bội phần. Webpack hiện đang là công cụ được sử dụng nhiều nhất, và Laravel Mix thì được xây dựng dựa trên Webpack.

Về cơ bản Laravel Mix sẽ giúp bạn viết css bằng các css preprocessor, đóng gói (bundle) các file js và minify chúng.

>> Khuyên bạn nên đọc bài: CSS preprocessor là gì.

Laravel Mix đã được tích hợp mặc định trong source code Laravel, để sử dụng Laravel Mix, bạn chỉ cần chạy lệnh npm install để cài đặt.

Chi tiết về cách sử dụng Laravel Mix, bạn có thể đọc tại tài liệu chính thức của Laravel.

IV. Tạm kết

Điểm danh trước 3 tính năng “Premium” trong Laravel mà chưa hẳn ai cũng biết, các tính năng còn lại mình sẽ tổng hợp và chia sẻ với các bạn qua Phần 2, Phần 3, … Phần N nhé.

Chúc các bạn học tập hiệu quả. Hẹn gặp lại.