Laravel Tips – Cơ bản đến nâng cao
- Home
- Laravel Tips – Cơ bản đến nâng cao
Laravel từ lâu đã trở thành framework PHP phổ biến hàng đầu nhờ tính thanh lịch, cú pháp biểu cảm và hệ sinh thái phong phú. Tuy nhiên, để phát triển một ứng dụng Laravel không chỉ “chạy được” mà còn sạch sẽ, bảo trì dễ dàng và đạt hiệu năng cao trong môi trường production, bạn cần nắm vững các mẹo (tips) từ cơ bản đến nâng cao dưới đây. Bài viết này được biên soạn dành riêng cho cộng đồng dev tại dcsofttech!
Ở giai đoạn cơ bản, việc tuân thủ các quy chuẩn và tận dụng triệt để các tính năng sẵn có của framework sẽ giúp bạn tiết kiệm hàng giờ viết code thừa.
Đây là lỗi phổ biến nhất của lập trình viên mới làm quen với Eloquent ORM.
Cách làm sai: Lấy danh sách bài viết rồi gọi vòng lặp lấy tên tác giả.
$posts = Post::all();
foreach ($posts as $post) {
echo $post->user->name; // Gây ra N+1 câu lệnh truy vấn database!
}
with() để load sẵn quan hệ.$posts = Post::with('user')->get(); // Chỉ tốn đúng 2 câu truy vấn
Mẹo nâng cao: Bạn có thể bật chế độ strict mode cho Eloquent trong AppServiceProvider để Laravel tự động báo lỗi khi xảy ra N+1 query ở môi trường local:
Model::preventLazyLoading(! app()->isProduction());
Đừng bao giờ nhét toàn bộ logic validate vào trong Controller khiến file trở nên cồng kềnh (Fat Controller). Hãy tận dụng Artisan CLI:
php artisan make:request StorePostRequest
Chuyển toàn bộ quy tắc vào hàm rules() trong StorePostRequest. Controller của bạn sẽ gọn gàng và tường minh hơn rất nhiều:
public function store(StorePostRequest $request) {
// Dữ liệu chắc chắn đã hợp lệ ở đây
Post::create($request->validated());
}
Nếu một controller của bạn chỉ đảm nhận một nhiệm vụ duy nhất (ví dụ: RegisterController, ExportReportController), hãy biến nó thành Single Action Controller bằng cách dùng phương thức __invoke:
php artisan make:controller ProvisionServer --invocable
Trong route, bạn chỉ cần gọi trực tiếp tên class mà không cần chỉ định tên hàm:
Route::post('/server/provision', ProvisionServer::class);
Khi dự án bắt đầu lớn lên, việc duy trì cấu trúc code sạch và giảm tải cho server là yếu tố sống còn.
Thay vì lặp đi lặp lại các câu lệnh điều kiện where dài dòng ở nhiều Controller, hãy định nghĩa chúng trực tiếp trong Eloquent Model:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model {
public function scopeActive($query) {
return $query->where('status', 'active');
}
}
Khi cần sử dụng, code của bạn sẽ cực kỳ “expressive” và dễ đọc:
$activeUsers = User::active()->get();
Những tác vụ mất thời gian như gửi email xác nhận, xử lý ảnh, gọi API bên thứ ba tuyệt đối không được xử lý đồng bộ trong HTTP request. Hãy đẩy chúng vào background jobs:
php artisan make:job SendWelcomeEmail
Sau đó dispatch job từ controller:
SendWelcomeEmail::dispatch($user);
Kết hợp cùng Laravel Horizon nếu bạn dùng Redis để giám sát queue jobs trực quan và mượt mà hơn.
Khi làm việc với API, đừng trả về trực tiếp Eloquent Model dạng mảng. Hãy dùng API Resources để kiểm soát chính xác cấu trúc dữ liệu trả về cho client:
php artisan make:resource UserResource
public function toArray($request) {
return [
'id' => $this->id,
'full_name' => $this->name,
'email' => $this->email,
'created_at' => $this->created_at->toIso8601String(),
];
}
Để ứng dụng chịu tải tốt (high-traffic), những kỹ thuật nâng cao sau đây sẽ giúp tăng tốc hệ thống lên đáng kể.
Trước khi đưa code lên môi trường production, hãy chạy bộ lệnh tối ưu hóa để Laravel không phải mất công đọc file cấu hình hay dò đường dẫn route từng request:
php artisan config:cache
php artisan route:cache
php artisan view:cache
Lưu ý: Nhớ chạy lại các lệnh này mỗi khi bạn thay đổi file .env hoặc file định tuyến (routes/*.php).
Một câu lệnh truy vấn phức tạp hay tìm kiếm trên bảng hàng triệu bản ghi sẽ chậm như rùa nếu thiếu Index. Hãy thêm index cho các cột thường xuyên dùng trong mệnh đề where, join, hoặc orderBy:
Schema::table('orders', function (Blueprint $table) {
$table->index(['user_id', 'status']);
});
Việc này có thể giảm thời gian thực thi câu lệnh SQL đi tới 70-90%.
Khi thực hiện nhiều thao tác liên quan đến nhiều bảng (ví dụ: Tạo đơn hàng + Trừ tiền tài khoản + Tạo hóa đơn), hãy luôn bọc chúng trong Database Transaction để đảm bảo tính toàn vẹn dữ liệu (Data Integrity):
use Illuminate\Support\Facades\DB;
DB::transaction(function () {
$order = Order::create([...]);
$order->payment()->create([...]);
// Nếu có lỗi ở đây, toàn bộ quá trình sẽ được rollback tự động
});
Việc làm chủ Laravel không chỉ dừng lại ở việc biết cách dùng các hàm có sẵn, mà là hiểu cách tối ưu hóa từng dòng code, từng câu lệnh SQL và kiến trúc hệ thống tổng thể. Áp dụng ngay những tips trên vào dự án tại dcsofttech để thấy sự khác biệt rõ rệt về hiệu năng cũng như chất lượng mã nguồn nhé!
Chúc các bạn code vui vẻ và hẹn gặp lại ở các bài viết chuyên sâu tiếp theo!