Laravel: Mô hình MVC

Trong bài viết này mình sẽ hướng dẫn các bạn tìm hiểu về mô hình MVC trong laravel và ví dụ thực tế áp dụng MVC vào cách code.

1. Mô hình Model View Controller

Các ứng dụng Laravel theo tuân theo mẫu thiết kế Model-View-Controller gồm có:

  • Controllers xử lý yêu cầu của người dùng và truy xuất dữ liệu, bằng cách tận dụng Models
  • Models tương tác với database và truy xuất các đối tượng từ thông tin của bạn.
  • Views để hiển thị các trang.

Ngoài ra, routes được sử dụng để ánh xạ các URLs tới các hành động được chỉ định trong controller, như hình dưới đây:

Chu trình MVC request trong ứng dụng laravel

Giải thích mô hình MVC:

  • Một request được tạo ra khi người dùng nhập một URL trên ứng dụng của bạn.
  • Một route đã được liên kết với URL ánh xạ URL tới một hành động trong controller.
  • Controller sử dụng các model cần thiết để trích xuất thông tin từ database, và sau đó truyển dữ liệu tới view.
  • Và view hiển thị kết quả của request.

Và xây dựng một ứng dụng MVC sử dụng Laravel thật dễ dàng.

2. Xây dựng ứng dụng mẫu

Để minh họa, tôi sẽ hướng dẫn bạn xây dựng một ứng dụng Laravel mẫu với tất cả các thành phần MVC – model, view và controller.

Giả sử bạn muốn xây dựng một ứng dụng quản lý companies (công ty)…

2.1 Model

Chúng ta sẽ bắt đầu bằng cách tạo một model, đại diện cho Company

Laravel có một giao diện dòng lệnh tuyệt vời Artisan CLI, cung cấp cho bạn một loạt các lệnh hữu ích để xây dựng ứng dụng của mình.

Mở command line, di chuyển tới thư mục chính của ứng dụng, và chạy lệnh sau để tạo một Company model mới:

Tất cả các model được lưu trữ trong thư mục app, vì vậy lệnh trên sẽ tạo ra một tệp tin model app/Company.php với nội dung như sau

Vì chức năng model có sẵn của Laravel, chỉ tạo một class model rỗng, Laravel sẽ giả sử rằng model này đã liên kết với một bảng companies trong cơ sở dữ liệu.

Và bằng việc cung cấp tùy chọn –migration khi tạo model, Laravel cũng tạo một tệp tin database migration để tạo bảng companies. Tệp tin migration được đặt tại [timestamp]_create_companies_table.php và có nội dung như sau:

(Nếu bạn chưa quen với khái niệm database migrations, đọc thêm về cách Laravel sử dụng database migrations để giúp bạn quản lý database trực tiếp trong ứng dụng. Nó khá tuyệt.)

Tất cả những gì bạn phải làm bây giờ là sử dụng tài liệu hướng dẫn Schema builder của Laravel để hoàn thành tệp tin migration. Bạn cũng có thể định nghĩa thêm một vài cột, giả sử là: name, type, size, address, logo và status:

Và sau đó bạn có thể chạy migration để tạo bảng companies sử dụng lệnh sau:

Table companies đã được tạo ra trong cơ sở dữ liệu, bây giờ chúng ta có thể chuyển sang tạo controller

Note: Ở bước này mình thêm một số công ty bằng cách thủ công vào bảng companies trong database để thuận lợi cho việc testing và demo.

2.2 Controller

Trong Laravel, một kiểu đối tượng – chẳng hạn company, trong trường hợp này – được gọi là một resource.

Bạn có thể tạo một resource controller – một controller xử lý tất cả các request liên quan tới một resouce, sử dụng lệnh:

Lệnh này sẽ tạo ra controller app/Http/Controllers/CompanyController.php với nội dung như sau:

Chú ý nó tự động tạo một controller với tất cả các hành động CRUD (Create, Retrieve/Read, Update, Delete).

Bây giờ, chúng ta chỉ cần định nghĩa các route để liên kết các URL với tất cả các hành động trong controller này.

2.3 Routes

Bạn có thể định nghĩa một resource route duy nhất, nó sẽ tạo ra các route cho tất cả các hành động trong resource controller.

Trong tệp tin cấu hình các route – routes/web.php – thêm định nghĩa một Company resource route như sau:

Định nghĩa route ở trên sẽ xác định tất cả các route liên quan tới Company resource:

Request Type Path Action Route Name
GET /companies index companies.index
GET /companies/create create companies.create
POST /companies store companies.store
GET /companies/{company} show companies.show
GET /companies/{company}/edit edit companies.edit
PUT/PATCH /companies/{company} update companies.update
DELETE /companies/{company} destroy companies.destroy

Bây giờ, để tiếp tục ví dụ chúng ta triển khai trang show Company.

2.4 Controller’s show action

Như đã thấy trong bảng route ở trên, trang Show Company sẽ có URL tương ứng là http://app.url/companies/{company}. Trong trường hợp này, {company} sẽ là id của một đối tượng company trong database.

Vì thế, URL để xem thông tin công ty có id là 1 sẽ như thế này http://app.url/companies/1.

Để triển khai trang Show Company, trong hành động show của controller, chúng ta cần:

  1. Sử dụng Company model để truy xuất đối tượng Company được chỉ định từ database.
  2. Tải một view cho trang Show Company, và truyền tới nó đối tượng Company truy xuất từ database.

Đầu tiên, để truy cập tới Company model trong controller, chúng ta cần thêm một câu lệnh use ở phía trên class controller:

Sau đó, chúng ta có thể hoàn thành hành động show với đoạn code sau:

Khi chúng ta nhập URL – http://app.url/companies/1 – Laravel sẽ lấy 1 trong URL thông qua biến $id trong hàm show, như ở phía trên.

Và truy xuất đối tượng company sử dụng model Company bằng cách gọi hàm Company::findOrFail với tham số $id.

View sẽ được tải sau đó sử dụng hàm view với tham số là tên của view (chúng ta sẽ tạo ở phần tiếp theo) và một mảng dữ liệu được cung cấp cho view.

Cuối cùng, chúng ta cần tạo view.

2.5 View

Các tệp tin view của Laravel được lưu trữ trong thư mục resources/views. Và chúng có thể được tổ chức vào các thư mục con trong thư mục này.

Ở phần trước chúng ta đã truyền vào hàm view một view với tên companies.show. Điều đó nói với Laravel tìm một tệp tin view có tên là show.blade.php được lưu trữ trong một thư mục con là resources/views/companies.

Các tệp tin view của Laravel sử dụng Blade templating engine, và vì thế nó có phần mở rộng là .blade.php

Vì thế, để hoàn thành trang Show Company này, chúng ta có thể tạo tệp tin view resources/views/companies/show.blade.phpvới nội dung như sau:

Vì chúng ta đã truyền đối tượng Company cho view – trong hành động show của controller – với mảng có key là company, nên chúng ta có thể truy cập nó trong view thông qua một biến cùng tên $company.

Các đối tượng được truy xuất thông qua một model là các instance của class model đó.

Và như bạn có thể thấy, các giá trị của đối tượng Company có thể truy cập sử dụng các tên giống như tên các cột trong bảng companies.

Cuối cùng, bạn sẽ sử dụng cú pháp của Blade để hiển thị thông tin. Ví dụ để hiển thị giá trị size của company:

Câu lệnh này sẽ được biên dịch thành câu lệnh echo của PHP thuần trong background:

Cú pháp của Blade làm cho việc viết các view nhanh hơn, thú vị hơn rất nhiều và đọc code cũng dễ dàng hơn.

Source code

Hi vọng sẽ giúp được bạn. Thanks