Quản lý thời hạn công việc với Global và Local Scope trong Laravel
Trong bất kỳ cổng việc làm nào, công việc nên hết hạn sau một khoảng thời gian nhất định. Một vấn đề phổ biến là công việc vẫn xuất hiện trong kết quả tìm kiếm, điều này gây khó chịu cho cả ứng viên và nhà tuyển dụng. Ở đây, chúng ta sẽ tìm hiểu cách thực hiện điều này một cách hiệu quả trong Laravel thông qua việc sử dụng Global và Local Scopes.
Giới thiệu
Khi phát triển một cổng việc làm, chúng ta thường không thêm chức năng hết hạn cho công việc để đảm bảo rằng cổng việc làm của chúng ta luôn hoạt động. Tuy nhiên, điều này dẫn đến việc ứng viên vẫn nhận thông báo từ những công việc đã hết hạn. Bài viết này sẽ giúp bạn hiểu rõ hơn về cách quản lý thời hạn công việc bằng cách sử dụng Global Scope trong Laravel, giúp mã nguồn trở nên sạch hơn và dễ bảo trì hơn.
Vấn đề phổ biến
Khi phát triển cổng việc làm, nhiều lập trình viên thường lặp lại logic kiểm tra thời gian hết hạn ở nhiều nơi khác nhau trong ứng dụng. Giả sử bạn có một phương thức để hiển thị danh sách công việc:
php
public function index()
{
$jobs = JobAdvertisement::where('expires_at', '>', now())->get();
return view('jobs.index', compact('jobs'));
}
Mặc dù giải pháp này có vẻ đơn giản, nhưng khi bạn có nhiều nơi cần cập nhật điều kiện này, việc bảo trì sẽ trở nên phức tạp và dễ gây ra lỗi. Đặc biệt là khi có một số nơi bạn có thể quên không thêm điều kiện kiểm tra thời gian hết hạn, dẫn đến việc ứng viên nhận thông báo từ những công việc đã hết hạn.
Ví dụ kiểm tra thời gian hết hạn
Một ví dụ khác về việc kiểm tra thời gian hết hạn có thể như sau:
php
public function show($id)
{
$job = JobAdvertisement::findOrFail($id);
if ($job->expires_at < now()) {
abort(404);
}
return view('jobs.show', compact('job'));
}
Như bạn thấy, chúng ta đang lặp lại logic này nhiều lần, và điều này không chỉ khó bảo trì mà còn dễ dẫn đến lỗi.
Giải pháp mới
Vậy tại sao chúng ta không để mô hình của mình tự biết khi nào một công việc đã hết hạn? Thay vì lặp lại logic này, chúng ta có thể sử dụng Global Scope để áp dụng điều kiện hết hạn cho tất cả các truy vấn liên quan đến công việc.
Sử dụng Global Scope
Dưới đây là cách áp dụng Global Scope cho mô hình JobAdvertisement:
php
class JobAdvertisement extends Model
{
protected static function booted()
{
static::addGlobalScope('active', function ($builder) {
$builder->where('expires_at', '>', now());
});
}
}
Với đoạn mã trên, mọi truy vấn đến mô hình JobAdvertisement sẽ tự động áp dụng điều kiện kiểm tra thời gian hết hạn. Ví dụ:
php
JobAdvertisement::all();
Khả năng truy cập công việc đã hết hạn
Tuy nhiên, sẽ có lúc quản trị viên hoặc nhà tuyển dụng cần truy cập vào những công việc đã hết hạn. Đừng lo, chúng ta có thể dễ dàng xử lý điều này bằng cách tạo Local Scope:
php
class JobAdvertisement extends Model
{
protected static function booted()
{
static::addGlobalScope('active', function ($builder) {
$builder->where('expires_at', '>', now());
});
}
public function scopeWithExpired($query)
{
return $query->withoutGlobalScope('active');
}
public function scopeOnlyExpired($query)
{
return $query->withoutGlobalScope('active')
->where('expires_at', '<=', now());
}
}
Cách sử dụng Local Scope
Để truy xuất danh sách công việc đã hết hạn hoặc bao gồm cả những công việc này, bạn chỉ cần gọi như sau:
php
$expiredJobAdvertisements = JobAdvertisement::onlyExpired()->get();
$jobAdvertisements = JobAdvertisement::withExpired()->get();
Thực hành tốt nhất
- Giữ cho logic đơn giản: Khi áp dụng Global Scope, hãy đảm bảo rằng logic không quá phức tạp để bảo trì dễ dàng hơn.
- Kiểm tra kỹ lưỡng: Luôn kiểm tra và đảm bảo rằng các truy vấn của bạn hoạt động như mong đợi, đặc biệt là khi sử dụng Global Scope.
Những lỗi thường gặp
- Quên áp dụng Local Scope: Đảm bảo rằng bạn luôn nhớ sử dụng Local Scope khi cần truy cập dữ liệu đã hết hạn.
- Sử dụng Global Scope không đúng cách: Tránh sử dụng Global Scope cho các truy vấn cần lọc dựa trên ngữ cảnh cụ thể của người dùng.
Mẹo tối ưu hiệu suất
- Chỉ áp dụng Global Scope khi cần thiết: Nếu bạn có một số mô hình không cần áp dụng điều kiện này, hãy cân nhắc việc không sử dụng Global Scope trên các mô hình đó.
- Tối ưu hóa truy vấn: Sử dụng các chỉ mục trong cơ sở dữ liệu để tối ưu hóa hiệu suất truy vấn.
Kết luận
Sử dụng Global Scope giúp mã nguồn trở nên sạch và dễ bảo trì hơn, nhưng bạn cần phải biết khi nào và ở đâu nên sử dụng nó. Nếu bạn có các quy tắc kinh doanh cần áp dụng cho tất cả các truy vấn, Global Scope là một lựa chọn tuyệt vời. Hãy đảm bảo rằng bạn không sử dụng nó cho các truy vấn cần lọc theo ngữ cảnh cụ thể của người dùng.
Câu hỏi thường gặp
- Global Scope là gì?
Global Scope là một cách áp dụng điều kiện đến tất cả các truy vấn cho một mô hình trong Laravel. - Làm thế nào để truy cập công việc đã hết hạn?
Bạn có thể sử dụng Local Scope để truy cập công việc đã hết hạn mà không bị ảnh hưởng bởi Global Scope.
Tài nguyên tham khảo
Với những kiến thức trong bài viết này, hy vọng bạn sẽ có thể quản lý thời hạn công việc một cách hiệu quả và tối ưu hóa ứng dụng của mình.