Nhanh hơn, chính xác hơn trên Laravel – P2

Chào tất cả các bạn, đã rất lâu rồi kể từ phần 1 . Rất xin lỗi vì có thể có nhiều bạn chờ mình ra bài tiếp theo. Quay trở lại mình có một ví dụ chắc chắn rất nhiều bạn từng làm qua rồi.

Mình có một bài toán đơn giản sau đó là chọn select category thì bên sub category sẽ lấy  ra danh sách tương ứng với category.  Quá dễ phải không?

Đến đây chắc nhiều bạn sẽ có thể code trong vài nốt nhạc xong. Mình thì xin trình bày cách mình làm thường làm nhé.

Đưới đây là controller gọi đến  view có chứa category và sub category

Đây là đoạn code dưới view của cateogry và sub category

Có thể nhiều bạn thắc mắc biến $categoryCompose ở đâu ra, có thấy nó được truyền từ controller xuống view đâu. Thực sự là nếu để ý thêm 1 chút ở tên biến nhiều bạn đã thấy ngay mình có sử dụng kỹ thuật ViewComposer của Laravel ở đây. Mình đặt biết có hậu tố là Compose để phân biệt với biến bình thường các bạn nhé. Nếu bạn nào chưa rõ về ViewComposer có thể tham khảo trên trang chủ của Laravel nhé.

Class có nhiệm vụ lấy dữ liệu và truyền xuống view

 

Đây là đăng ký tại method boot của ServiceProvider. Nó làm nhiệm vụ đăng ký nhưng view được nhận dữ liệu từ CategoryComposer. Bạn thấy rằng nó có chứa view “doc::doc-lesson.create”  đó. 😀

Đến đây chúng ta đã giải quyết được 1 phần  50% bài toán trên. Bây giờ chỉ còn là công đoạn chọn category thì sẽ list ra danh sách sub category thôi.

Đây là đoạn js xử lý công việc trên.

Nếu để ý các bạn thấy mình có sử Jquey plugin ở đây. Động đến Js thì chắc chắn đây là một kỹ thuật Ajax rồi.

Dưới đây là một phần xử lý lấy sub cateogry theo category.

Vì sao mình lại sử dụng Trait ở đây. Như các bạn đã biết Trait là một kỹ thuật đa thừa kế trong PHP. Vì lỡ đâu chúng ta sẽ không chỉ lấy sub cateory theo category mà có 1 đống các xử lý khác lấy bà abc theo ý ông xyz thì sao. Mình chỉ cần thừa kế những gì đã có và không phải viết lại lần nào nữa.  Các bạn cũng thấy rằng mình có xử dụng Repository  pattern ở đây.  Và dưới đây là đoạn  code đó.

Phần này mình cũng sử dụng Trait vì biết mình chắc là sẽ có rất nhiều đối tượng sẽ lấy kiểu dữ liệu như thế này và mình sẽ không phải viết lại lần nào nữa.  Và dưới đây là scrope filter ở model. Kỹ thuật này được trình bày rât rõ trên docs của Laravel.

Thường thì hầu như Table nào cũng có phần filter tìm kiếm dữ liệu. Các bạn có thể code lại đoạn filter này dưới dang ModelTrain để viết 1 lần sử dụng lại nhiều lần ở các model khác.

Cuối  cùng chắc nhiều bạn thắc mắc về phần xử lý Js và cái plugin kia ở đâu, thì ngay bây giờ dưới đây là phân code plugin đoạn js đó các bạn nhé.

Cái bài toán bé tí tẹo mà sử dụng đủ các thể loại trên đời này. Nhưng cái gì cũng có giá của nó nhé.

  • Đơn giản ở đây mình chỉ viết 1 lần lấy list dữ liệu category rồi  có thể dùng lại ở các view khác, đơn giản chỉ cần đăng ký thêm view ở Service Provider nhé.
  • Việc lấy  controller lấy danh sách dữ liệu dạng list thì chỉ cần  use ControllerTrait là mình sẽ có ngay  1 method lấy dữ liệu. Có thể là một số table khác như Group, Type, Tag … Với Reposiory và Model cũng tương tự nhé.
  • Việc viết js thành plugin cũng giúp chúng ta chỉ cần truyền một số tham số cần thiết là không cần viết lại quá trình xử lý.

Những phần phân tách như dùng lại như thế này, các bạn có thể đóng gói chúng thành 1 modul hay 1 packages để có thể sử dụng ở những dự án khác là hoàn toàn được nhé.

Dưới đây là sơ đồ tổng quan của ví dụ

Cuối cùng cảm ơn các bạn đã để tâm theo dõi, mong các bạn góp ý cho bài viết của mình.

Nhân tiện đây mình cũng giới thiệu một page test kiến thức công nghệ thông tin.

Trang mình mới code chắc  còn nhiều bug lắm.

Các bạn rảnh qua ủng hộ nhé. 

Xin chào và hẹn gặp lại.