0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Bỏ Qua Livewire? Laravel Blade + AQC + Alpine Đủ Rồi!

Đăng vào 1 tháng trước

• 3 phút đọc

Giới Thiệu

Livewire là một lựa chọn phổ biến trong hệ sinh thái Laravel để xây dựng giao diện người dùng phản ứng mà không cần viết toàn bộ frontend bằng Vue hoặc React. Nó kết hợp một cách hài hòa giữa frontend và backend, nhưng điều đó không có nghĩa là nó luôn là công cụ tốt nhất cho mọi tình huống.

Trong vài năm qua, tôi đã tinh chỉnh một kiến trúc Laravel mà đặt logic kinh doanh lên hàng đầu. Kiến trúc này sạch sẽ, có thể kiểm tra, tái sử dụng và không phụ thuộc vào các framework bổ sung. Phương pháp của tôi kết hợp ba công cụ cốt lõi:

  • AQC (Atomic Query Construction) — để đóng gói logic kinh doanh
  • Blade Partials + Fetch API — cho các cập nhật UI động
  • Alpine.js — cho tính tương tác nhẹ nhàng

Và đây là lập luận của tôi: khi làm đúng cách, bộ công cụ này khiến Livewire trở nên không cần thiết.


Backend: Laravel + AQC

Tôi đã giới thiệu mô hình AQC để tổ chức logic backend thành các lớp nhỏ, nguyên tử. Mỗi biểu mẫu, bảng và tương tác UI tương ứng với một lớp chỉ xử lý một mối quan tâm — từ việc lấy các bài viết đã lọc đến việc gửi biểu mẫu.

Livewire buộc bạn phải đẩy logic vào các phương thức thành phần. Nhưng AQC tách biệt một cách rõ ràng và cho phép các controller, API, và thậm chí cả các Blade fetchers tái sử dụng mà không bị lặp lại.

Vậy tại sao phải viết lại cùng một logic trong một lớp Livewire?


Giao Diện: Blade Partials + AJAX

Trong phương pháp của tôi, các view phân đoạn được trả về qua các route controller. Những partial này đã:

  • Được xác thực
  • Được kiểm tra
  • Được điều kiện hóa thông qua Blade
  • Sẵn sàng để chèn vào DOM

Điều này có nghĩa là:

  • Bạn viết mã Laravel thông thường.
  • Bạn không tạo ra cú pháp Livewire (wire:model, v.v.).
  • Bạn có thể gỡ lỗi như bất kỳ route nào khác.

Một fetch() đơn giản thay thế hoàn toàn nhu cầu cho wire:click, wire:model, wire:submit, v.v.


Giao Diện Người Dùng: Alpine.js (Khi Cần)

Cho các tab, modal, dropdowns, và các bộ đếm động — Alpine đủ tốt.

Không cần virtual DOM. Không cần các lifecycle hooks. Chỉ cần HTML với hành vi được thêm vào.

Và phần tốt nhất? Alpine không can thiệp vào Blade hoặc nội dung được chèn từ fetch. Nó chỉ hoạt động.


Nhưng Livewire Có Thực Hiện Tất Cả Điều Này Không?

Có, nhưng với một chi phí:


Góc Nhìn Của Một Nhà Phát Triển Laravel

Livewire thêm một lớp bổ sung. Lớp này hữu ích cho những người:

  • Không muốn viết JS
  • Chấp nhận đặt logic trong các lớp thành phần
  • Không tuân theo thiết kế backend-first như AQC

Nhưng nếu bạn đã cấu trúc ứng dụng của mình một cách rõ ràng — Livewire chỉ là sự lặp lại. Bạn làm nhiều hơn để tránh JavaScript, trong khi mất đi sức mạnh của cấu trúc Laravel hiện có của bạn.


Cải Thiện Phương Pháp Của Tôi Hơn Nữa

Điều này không phải là tĩnh — đây là cách tôi tiếp tục cải thiện:

  • Sử dụng IntersectionObserver để lấy các partial chỉ khi chúng hiển thị
  • Lưu cache các partial đã render cho các phần DOM lặp lại (ví dụ: tùy chọn dropdown)
  • Kết hợp AQC với Jobs cho các hoạt động nặng nề trong nền
  • Sử dụng Turbo/Hotwire nếu bạn muốn điều hướng pushState với các partial HTML

Kết Luận

Tôi không nói Livewire là xấu. Nó là một công cụ tuyệt vời cho các nhóm cần một cái gì đó giữa Blade và Vue. Nhưng nếu bạn đã viết Laravel theo cách sạch sẽ — nếu bạn đã có sự phân tách đúng đắn về các mối quan tâm — thì Livewire có thể chỉ giải quyết các vấn đề mà bạn không có.

Bộ công cụ controller + AQC + Blade + Alpine của bạn là:

  • Nhanh hơn để hiểu
  • Dễ dàng kiểm tra hơn
  • Bản địa của Laravel
  • Hoàn toàn dưới sự kiểm soát của bạn

Đó là lý do tại sao tôi đã bỏ qua Livewire — và có thể bạn cũng nên như vậy.


Nếu bạn thấy bài viết này hữu ích, hãy xem xét việc hỗ trợ công việc của tôi — điều đó có ý nghĩa rất lớn với tôi.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào