Mẹo Laravel - Giảm bớt các điều kiện phức tạp trong Blade template

Các tập tin Blade template cho phép chúng ta sử dụng các điều kiện logic như @if hoặc @isset. Tuy nhiên, cần đảm bảo rằng chúng ta không quá lạm dụng những điều kiện logic này bằng cách đưa quá nhiều điều kiện logic vào tập tin Blade của chúng ta.

Các tập tin Blade nằm trong thư mục resources/views thực hiện chức năng hiển thị trong mô hình MVC của Laravel. Điều này có nghĩa nó chỉ thực hiện chức năng hiển thị mà thôi, do đó, các điều kiện hoặc xử lý dữ liệu đã được thực hiện ở Model hoặc Controller.

Mặc dù, một số dữ liệu mà bạn gửi qua views có vẻ bắt buộc/hiển nhiên, chẳng hạn như giá trị boolean hoặc chuỗi từ một Model, hoặc các dữ liệu khác không được cắt bớt hoặc giảm lại. Trong trường hợp này, bạn phải tính toán ở nơi khác và trả kết quả về cho views

Hãy xem một ví dụ bên dưới đây:

Giả sử bạn cần một chế độ xem với các điều kiện như sau:

  • Có phải là khách hàng cao cấp hay không (Premium Account)
  • Khách hàng đã thiết lập tài khoản thanh toán hay chưa

Chúng ta có một cột đánh dấu xác nhận xem họ có phải là một tài khoản trả phí hay không, và chúng ta dùng Paypal để thanh toán, vì vậy người dùng sẽ có một mã token từ Paypal được lưu trong hồ sơ tài khoản của họ nếu đã thiết lập xong.

Có lẽ chúng ta sẽ làm như sau trong Controller (yeah nó có thể đúng hoặc sai với bạn)

return view('path.to.view', [
  'user' => $user,
]);

Nếu chúng ta lấy thông tin người dùng, vậy tại sao chúng ta không lấy toàn bộ thông tin của người dùng ra?

Điều này thật tệ vì một số lý do:

  • Đầu tiên, chúng ta không nên gửi nhiều thông tin tới views, đề phòng trường hợp chúng ta vô tình hiển thị thông tin đó ra (bằng cách này hay cách khác)
  • Tiếp theo, điều này bắt buộc chúng ta phải hiểu cấu trúc của mảng $user, điều này ở một số trường hợp thì lại chiếm quá nhiều trách nhiệm và yêu cầu quá cao. Hãy tưởng tượng điều gì sẽ xảy ra nếu chúng ta cần phải thay đổi một column name nào đó trong table user? Lúc đó chúng ta phải xem và điều chỉnh lại tất cả những nơi có liên quan đến $user, bao gồm Model, Controller và vô số Views.

Vậy, như ví dụ bên dưới đây thì sao?

return view('path.to.view', [
  'is_premium' => $user->is_premium,
  'paypal_token' => $user->paypal_token,
]);

Trong tập tin Blade có thể bạn sẽ viết thế này:

@if($paypal_token)
  <h2>Thông tin thanh toán</h2>
  ...

Bây giờ chúng ta như đang chơi với lửa vậy! Vì chúng ta đang gửi dữ liệu bí mật qua cho views và chúng ta đang hi vọng rằng nó sẽ không bao giờ được hiển thị (bởi vì token Paypal rất quan trọng). Ngoài ra, nếu chúng ta thay đổi nhà cung cấp thanh toán từ Paypal sang Momo hay Napas chẳng hạn, thì chúng ta phải thay đổi luôn tên của biến này, không thể để $paypal_token được vì nó sẽ gây nhầm lẫn với các dịch vụ thanh toán khác, vì khi bạn để như vậy, mặc dù nó cùng tên là $paypal_token, nhưng giá trị của nó lại khác nhau, điều này sẽ thật tệ đến một lúc nào đó, tin tui đi!

Vậy, hãy thử cách sau:

return view('path.to.view', [
  'is_premium' => $user->is_premium,
  'has_billing_account' => !empty($user->paypal_token),
]);

Và ở views chúng ta có thể kiểm tra như sau:

@if($has_billing_account)
  <h2>Thông tin thanh toán</h2>
  ...

Và kết quả, chúng ta không gửi bất kỳ thông tin bảo mật nào sang views, nó rất dễ để đọc, và không yêu cầu tệp blade của chúng ta phải hiểu chi tiết về đối tượng. Thật tuyệt vời.

Đến đây thì mẹo thứ ba đã kết thúc, rất cảm ơn bạn đã chịu khó đọc đến đây, nếu có chỗ nào khó hiểu, bạn có thể để lại bình luận, mình sẽ trả lời lại cho các bạn trong sự hiểu biết của mình nhé. Hẹn gặp lại bạn trong mẹo tiếp theo.

Chuyên đề: Mẹo Lập trình Laravel
Bài trước Bài tiếp theo
Lưu ý: Hệ thống bài học theo Chuyên Đề đang được thử nghiệm.
Mẹo Laravel - Giảm bớt các điều kiện phức tạp trong Blade template

Danh sách bài học

Cùng chuyên mục

Xem nhiều hôm nay