Kiến trúc hệ thống trên Laravel – phần 9

Đây sẽ là 1 series gồm 1 số phần như sau:


Rồi, cuối cùng chúng ta cũng đến phần cuối cùng. Phần này chúng ta sẽ có 2 bài riêng biệt tương ứng với 2 kiến trúc gần giống nhau :D.

Nhưng trước hết, kiến trúc code (code structure) theo các bạn là gì?

> Theo mình, nó đơn giản lắm, chỉ là cách sắp đặt code để đạt được 1 mục đích nhất định.

Nào, mục đích của các bạn là gì? Mục đích của mình thì đơn giản lắm, chỉ cố gắng biến các component thành dạng plug n play, thích thì nhúng vào, không thích thì bỏ ra -> cần sắp đặt code sao cho thực hiện được việc này dễ nhất.

Với mục đích đó, đương nhiên trước tiên mình cần phải xác định các component sẽ tương tác với nhau trong hệ thống

Trong phần 6, mình cũng có nói về việc xử lý 1 request thì thường đi qua những phần nào.

Request -> check authen -> check author -> validation -> process raw request data -> update database -> render view -> Response

Vậy cách mình xử lý nhưng phần trên như thế nào:

  • Check Authen: sử dụng middleware mặc định của Laravel
  • Check Authorization: đơn giản nhất sử dụng ACL mặc định của Laravel hoặc các package nổi tiếng về Authorization (các bạn xem lại phần 8 nhé)
  • Validation: sử dụng Request của Laravel hoặc sử dụng Ardent
  • Process Raw data: tách ra thành các class riêng gọi là services -> nhớ luôn phải tạo interface và inject interface đó vào trong controller nhé
  • Tương tác với database: Sử dụng repository, inject vào service.
  • Render view: Tất nhiên là sử dụng blade của Laravel rồi.

OK, chúng ta vào ví dụ cụ thể nhé. Mình sẽ hướng dẫn các bạn làm 1 cái cơ bản nhất để thể hiện ý tưởng của mình, đó là làm 1 cái CRUD cơ bản ^^. Mình luôn luôn lấy ví dụ này để training cho các bạn mới vào, chỉ cần tạo 1 CRUD liên quan tới Book (title, author) là okie ^^.

1. Khởi tạo project

Tạo project mới bằng command

Sau đó vào thư mục demo mới tạo và edit file .env để link tới database mới tạo của bạn

Sau đó edit file config/database, comment 2 dòng dưới đây:

Chạy command dưới đây để tạo hệ thống authentication default của Laravel

Cuối cùng chạy các lệnh sau để migrate database

Vậy là các bạn có 1 hệ thống với các chức năng default của Laravel (Login / Register) -> giờ hoặc trỏ vhost hoặc chạy lệnh dưới đây để test laravel ở port 8000

Bạn hãy chạy thử và đăng ký thử 1 user xem.

2. Cấu trúc project

Tạo mới thư mục “core” ở root của project

Edit file composer.json để autoload thực mực core

Thực hiện lệnh dưới đây để autoload

Rồi, giờ chúng ta sẽ tạo các sub-folder trong thư mục “core”. Bạn nhớ các sub-folder luôn phải viết hoa chữ cái đầu nhé.

Với phần tích ban đầu thì chỉ có Services và Repository là sử dụng ngoài core của Laravel -> chúng ta sẽ thêm 2 sub-folder là “Repositories” và “Services”.

Chúng ta sẽ cần 1 chỗ để bindding interface thành concrete class -> Tạo 1 file CoreServiceProvider.php trong thư mục con “core/Providers” để làm việc này

Sau khi hoàn thành xong thì bạn sẽ có cấu trúc folder như dưới đây.

Edit config/app.php để load CoreServiceProvider -> thêm dòng dưới đây vào providers array:

3. Tạo migration, controller, model và route

Chúng ta sẽ tạo migration cho Book (title, author) bằng command sau:

Mở file migration mới được tạo ra và thêm title, author như sau:

chạy lệnh migrate để update database

Tiếp theo là tạo controller

Tạo model

Mở file app/Book.php và thêm dòng dưới đây vào:

Thêm dòng mới vào trong route (routes/web.php)

4. Xử lý chính trong hệ thống

*) Áp middleware cho Authentication (Authorization mình sẽ ko nhắc tới ở đây ^^) 

Áp dụng route group vào

Ở thời điểm này nếu bạn chưa login mà vào ../books thì sẽ bị redirect lại trang login là chắc chắn ^^.

*) Dùng request để validate: chúng ta sẽ validate trong 2 trường hợp, khi tạo mới và khi edit -> cần tạo 2 request khác nhau:

Mở lần lượt từng file request mới được tạo ra (trong folder app/Http/Requests) và thay đổi

  • Hàm authorize() thì return true –> bạn có thể thực thi authorize cho request này ở đây cũng được, nhưng mình thường ko xử lý gì ở đây
  • Hàm rules() thì return array dưới đây

Sử dụng request trong controller -> Mở file BooksController.php và sửa lại signature của 2 hàm: store và update

Nhớ import namespace trên đầu file BooksController.php

*) Tạo Repository

Tạo mới interface BookRepositoryContract (core/Repositories/BookRepositoryContract.php)

Tạo class xử lý Repository (core/Repositories/BookRepository.php)

Binding trong CoreServiceProvider

Nhớ import namespace ở đầu file

*) Tạo Services

Tạo mới interface core/Services/BookServiceContract.php

Tạo mới class core/Services/BookService.php

Bạn chú ý là mình inject interface BookRepositoryContract vào trong class này -> luôn luôn inject interface nhé.

Cuối cùng bindding trong CoreServiceProvider thôi

*) Chỉnh sửa BooksController để nhúng service vào

Bạn thấy không, mình inject interface BookServiceContract vào trong controllers đấy nhé ^^.

*) Cuối cùng, tạo view bằng blade, phần này cho phép mình ko post code ở đây nhé


Phù, cuối cùng cũng xong, hi vọng các bạn làm theo dễ dàng và có thể chạy được luôn

Bạn thấy đấy cách viết này sinh ra rất nhiều class nhưng mình hoàn toàn có thể thay thế dễ dàng vì đã inject interface và bindding trong CoreServiceProvider -> Ngoài ra nếu decorator để tạo ra 1 layer cache là hoàn toàn khả thi trong tầm tay rồi (bạn xem lại bài post trước để biết cách decorator cache nhé)

Nhưng, như mình đã nói ở đầu, mục tiêu của mình là plugin and play -> các component ở đây cũng tương đối linh hoạt rồi, nhưng nếu mình muốn đem toàn bộ BookCRUD này sang 1 hệ thống khác thì sẽ làm thế nào? Sẽ phải copy:

  • Toàn bộ thư mục core
  • BooksController
  • Book model
  • Requests
  • Views
  • Copy route

@@ Quá nhiều thứ, làm cách nào 1 phát ăn luôn nhỉ ^^ -> Câu trả lời của mình là biến BookCRUD này thành 1 package và install / remove thông qua composer -> Đó chính là nội dung của bài sau và cũng là bài cuối cùng của series này, mong các bạn sẽ tiếp tục đồng hành. Xin cảm ơn

À mà quên: code mình đã push lên git rồi nhé. Bạn clone về và chạy composer install, tạo file .env, tạo database mới và migrate là sẽ chạy được nhé 🙂

https://github.com/trthanhbk/BookCRUD

P/S: ăn gian 1 tí, bên mình đang tuyển dụng nhân tài Laravel nhá, mong gặp bạn trong 1 ngày gần đấy

Portal Beanz Việt Nam tuyển dụng tháng 04 – 2017

    1. Thương Nguyễn April 24, 2017
      • Thành Nguyễn Trung May 3, 2017
    2. Thanh May 18, 2017
      • Thành Nguyễn Trung May 19, 2017

    Add Your Comment