Một Số Tips Hữu Ích Khi Làm Việc Với Laravel

Mở Đầu

Laravel là một framework mã nguồn mở của PHP được biết đến bởi nhiều lập trình viên trong việc sử dụng để thiết kế các website. Trong quá trình làm việc, mình cũng tìm hiểu và đúc kết một số best practice mà chúng ta nên sử dụng trong dự án, giúp ứng dụng của chúng ta có performance tốt hơn và code clean hơn.

Nên sử dụng local scope khi bạn muốn tạo các ràng buộc truy vấn trên model

Ví dụ chúng ta thường sử dụng :

$orders = Order::where('status', 'accepted')->where('paid', true)->get();

Nên sử dụng local scope giúp chúng ta tạo ra các Query Builder Method để ràng buộc khi lấy dữ liệu.

class Order extends Model
{
   ...
   public function scopeDelivered($query) {
      return $query->where('status', 'acepted');
  }
  public function scopePaid($query) {
      return $query->where('paid', true);
   }
}  

Sau khi chúng ta sử dụng local scope thì câu query chúng ta sẽ trở nên đơn giản như thế này.

$orders = Order::delivered()->paid()->get();

Sử dụng Request file để validate dữ liệu khi cần

Thông thường chúng ta sẽ validate dữ liệu như thế này :

public function store(Request $request)
{
    $validatedData = $request->validate([
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);
      // The blog post is valid...
}

Nhưng khi trong controller method của bạn có quá nhiều code xử lý thì trông sẽ không pretty. Để giải quyết vấn đề này Laravel cung cấp một cách validate thông qua Request Class mà chúng ta tạo.

php artisan make:request StorePostRequest

Trong thư mục app/Http/Requests/ bạn sẽ tìm thấy file :

class StorePostRequest extends FormRequest
{
   public function authorize()
   {
      return true;
   }
   public function rules()
   {
       return [
         'title' => 'required|unique:posts|max:255',
         'body' => 'required',
       ];
   }
}

Trong controller method chúng ta sẽ thay đổi Request class thành storePostRequest class

use App\Http\Requests\storePostRequest;
public function store(StorePostRequest $request)
{
    // The blog post is valid...
}

Ngoài ra chúng ta có thể custom thông báo lỗi khi validate thông qua method :

public function messages()
   {
      return [
        'title.required' => 'The title is required.',
        'title.unique' => 'The post title already exists.',
        ...
      ];
   }

Một số magic scope

Sắp xếp kết quả truy vấn giảm dần theo created_at

User::latest()->get();

Tăng dần theo created_at

User::oldest()->get();

Kết quả truy vấn random:

User::inRandomOrder()->get();

Sử dụng background job cho các tác vụ mất thời gian

Laravel Jobs là công cụ mạnh mẽ giúp chúng ta thực thi các tác vụ mất thời gian của hệ thống một cách ngầm định. Ví dụ : Gửi mail thông báo đơn hàng cho khách hàng. Tác vụ xử lý hình ảnh nặng trên server.

Tránh vấn đề N+1 query

Đây là khi bạn truy vấn để lấy dữ liệu thông qua các quan hệ trong một vòng lặp, giả sử :

$comments = Comment::all()
@foreach($comments as $comment)
{{ $comment->author->name }}
@endforeach

Bạn sẽ tốn N câu query nếu có N records trong bảng comments và 1 câu query lấy tất cả các comment => Tốn N + 1 câu query.

Cách giải quyết vấn đề này chúng ta sử dụng method with() trong Laravel thông qua mối quan hệ author :

$comments = Comment::with(‘author’)->get();

Chúng ta sẽ tốn 2 câu lệnh query như sau :

select * from books
select * from authors where id in (1, 2, 3, 4, 5, ...)

Sử dụng XorY method

Eloquent có một vài function kết hợp 2 method như findOrFail(), firstOrCreate() Thay vì :

$user = User::find($id);
if (!$user) {
    abort(404);
}

Hãy sử dụng:

$user = User::findOrFail($id)

Sử dụng Eloquent::when() :

Thay vì khi chúng ta làm chức năng filter sẽ code như sau :

if (request('filter_by') == 'likes') {
    $query->where('likes', '>', request('likes_amount', 0));
}
if (request('filter_by') == 'date') {
    $query->orderBy('created_at', request('ordering_rule', 'desc'));
}

Nên sử dụng :

$query = Author::query();
$query->when(request('filter_by') == 'likes', function ($q) {
    return $q->where('likes', '>', request('likes_amount', 0));
});
$query->when(request('filter_by') == 'date', function ($q) {
    return $q->orderBy('created_at', request('ordering_rule', 'desc'));
});

Tham khảo


All Rights Reserved