1. Về Model bạn đang đi khá đúng. chỉ cần bổ sung một chút.
- Hãy tạo một class
Model
trong đó chưa các thương thức như get()
, insert()
, update()
, delete()
và các thuộc tính như table
, primary_key
- Tiếp đó hãy để những Model khác kế thức từ class
Model
này. Ví dụ mình ko biết bạn dùng ngôn ngữ nào nên cí dụ với PHP
// Model.php
class Model
{
protected $table = '';
protected $primaryKey = 'id';
public function get($col = '*') {
$sql = "SELECT $col FROM $this->table";
// Thực thi câu query trên rồi trả về kết quả.
// ...
}
// Tạo các method khác như `insert()`, `update()`, `delete()`
}
// User.php
class User extends Model
{
protected $table = 'users';
// protected $primaryKey = 'id'; // Nếu khóa chính của bảng users là id rồi thì không cần dòng này
protected $primaryKey = 'user_id'; // Nếu kháo chính của bảng users KHÔNG phải là id thì define vào.
}
Như vậy từ User
hay Post
, Comment
bạn có thể gọi đến những method cơ bản như get()
, insert()
, update()
, delete()
mà ko cần phải viết lại.
Bạn nên bổ sung namespace
cho các class nữa.
2. Về controller. Phần này bạn đang khá sai.
- Trước hết, không phải tất cả các method trong controller đều phải trả về view.
- Bạn hãy tập trung vào resource. Chính là
User
, Product
, Post
đó cũng sẽ là tên của các controller như: UserController
PHP có Laravel framework app dụng cái này rất tốt bạn có thể tham khảo bảng sau.
Như bạn thấy URI
của một số request có thể giống nhau nhưng HTTP Method khác nhau thì sẽ gọi đến một hàm (method) trong class khác nhau.
Tất nhiên để làm được việc này bạn phải viết code để kiểm tra HTTP method là gì rồi gọi đúng hàm (method) chứ ngôn ngữ không thể tự động làm được
Những kiến thức bạn cần có ở đoạn này chủ yếu về HTTP request và cách ngôn ngữ bạn đang dùng xử lý request. Là kiến thức cơ bản như không dễ để áp dụng đâu
Quay lại vấn đề của bạn.
Mình khuyên bạn chuển tất cả lên class, method sang tiếng anh. Hãy giữ dìn sự trong sáng cho tiếng Việt
mình vừa xem danh sách Mặt hàng, tìm kiếm, bình luận trên cùng 1 giao diện.=>Trong khi ở đây MatHangController có các phương thức timkiem(…), xemdanhsach(),binhluan(…) gọi đến 3 view khác nhau (mà lẽ ra 3 cái này nó phải gộp lại làm 1)
Phân tích đoạn trên của bạn nhé.
mình vừa xem danh sách Mặt hàng, tìm kiếm, bình luận trên cùng 1 giao diện.
OK đoạn này đã rõ.
Đến cái này.
Trong khi ở đây MatHangController có các phương thức timkiem(…), xemdanhsach(),binhluan(…)
Dừng lại ở đây. Vì sao danh sách mặt hàng và tìm kiếm lại nằm ở 2 method khác nhau trong khi chúng chỉ là 1?
- Đầu tiên hãy tạo 1 method để lấy danh sach mặt hàng. URL mình có được là
localhost/products
- Tiếp theo hãy chắc chắn rằng form tìm kiếm của bạn dùng method GET. Vậy nên khi bạn thực hiện tìm kiếm. URL mình có khi tìm kiếm sach là:
localhost/products?search=sach
Như bạn thấy nó chỉ là URL của danh sách mặt hàng tuy nhiên có bổ sung query URL.
Code ví dụ:
// Product.php
class Product extends Model
{
protected $table = 'products';
// Tạo 1 function get list. Có thể dùng lại get() bên Model nhưng giờ làm như vậy cho nhanh
public function getList($search = '') {
// Câu này cho phần danh sách tất cả.
$sql = "SELECT $col FROM $this->table ";
// Nếu cần tìm kiếm
if ($search) {
$sql .= "WHERE name '%$search%'"
}
// Thực thi câu query trên và return thôi.
// ...
}
}
// ProductController.php
class ProductController
{
// Mình tạo function index để lấy danh sách
public function index() {
$prdObj = new Product; // Cái này là Model nhé.
$search = null;
if (isset($_GET['search'])) {
$search = $_GET['search'];
}
$products = $prdObj->getList($search); // Đây là method get() mình đã tạo ở model phía trên nhé.
// $products là danh sách sản phẩm. Có rồi thì trả về view thôi.
}
}
Như bạn thấy danh sách và tìm kiếm là 1. chỉ cà cái có điều kiện cái không có thôi.
Tiếp theo method binhluan()
của bạn. Mình không rõ đoạn này. bạn đang muốn bình luận ở trang tìm kiếm hay sao lại cùng view được?
Mình sẽ hiểu như là bạn muốn bình luận trong trang chi tiết sản phẩm.
Nói nhanh nó thế này.
-
ProductController::show() => Đây là method show view phần chi tiết, view này kèm form bình luận nhé. Có URL là localhost/products/1
method GET. 1
là ID của product nhé.
-
CommentController::store() => Đây là method thực hiện lưu comment. có URL là localhost/comments
method POST
-
Ở ProductController::show()
bạn đã trả về view có form bình luận rồi, from bình luận này bạn để action là localhost/comments
là xong.
-
CommentController::store()
xử lý lưu comment xong thì redirect về lại localhost/products/1
Trên kia là những góp ý của mình về việc sử dụng MVC. Tất cả những ý kiến trên đều là từ mình không từ nguồn nào nên không được kiểm chứng là tốt và đúng nhé
- Những sample code trên mình viết mà chưa test có thể sẽ có lỗi.
- Đây không phải là tutorial nên bạn code code đó về không chạy được đâu.
- Những kiến thức mình dùng ở đoạn phân thích trên gồm: PHP, OOP, MVC, HTTP request.
- Có thể có lỗi chính tả ở đâu đó
Chúc bạn có thể hiểu và áp dùng MVC thanh công.