2008-09-26 41 views
5

sự hiểu biết của tôi về MVC là như sau (trong trường hợp đó là sai lầm khủng khiếp, tôi sau tất cả mới cho nó)MVC, các lớp học sẽ đi đâu?

  1. Models là những điều mà giao diện với các cơ sở dữ liệu
  2. xem là những thiết kế/bố trí của trang
  3. Controller là nơi mọi thứ bắt đầu và cơ bản là logic trang

tôi đang sử dụng CodeIgniter nhưng tôi sẽ đánh bạo đoán nó không chỉ giới hạn ở đó hoặc thậm chí có thể chỉ để khuôn khổ PHP.

Tôi đặt các lớp học toàn cầu ở đâu?

Tôi có thể có một mô hình cho Sản phẩm và sau đó chạy truy vấn thu thập 20 sản phẩm từ cơ sở dữ liệu. Bây giờ tôi có tạo ra 20 mẫu hay tôi nên có một lớp riêng biệt cho nó, nếu sau này, tôi đặt lớp này ở đâu (các bộ điều khiển khác cũng sẽ cần sử dụng nó)

Trả lời

4

Mô hình là từ sai khi sử dụng khi thảo luận phải làm gì với sản phẩm: mỗi sản phẩm là một đối tượng giá trị (VO) (hoặc truyền dữ liệu objet/DTO, bất kỳ điều gì phù hợp trong miệng của bạn). Các đối tượng giá trị thường có cùng các trường mà một bảng chứa. Trong trường hợp của bạn, ProductVO sẽ có các trường nằm trong bảng Products.

Model là một Object Access dữ liệu (DAO) rằng có phương pháp như

findByPk --> returns a single value object 
findAll --> returns a collection of value objects (0-n) 
etc. 

Trong trường hợp của bạn, bạn sẽ có một ProductDAO rằng có một cái gì đó giống như các phương pháp trên. ProductDAO này sau đó sẽ trả lại ProductVO và các bộ sưu tập của họ.

Đối tượng truy cập dữ liệu cũng có thể trả lại đối tượng kinh doanh (BO) có thể chứa nhiều phương thức VO và phương thức bổ sung dành riêng cho doanh nghiệp.

Hợp đồng bổ sung: Trong bộ điều khiển của bạn, bạn gọi cho ProductDAO để tìm sản phẩm bạn muốn. (Các) ProductVO được trả về sau đó được chuyển tới khung nhìn (như các thuộc tính yêu cầu trong Java). Chế độ xem sau đó lặp lại/hiển thị dữ liệu từ productVO.

1

Trong CakePHP có thêm 3 "phần":

  1. hành vi
  2. Components
  3. Helpers

logic được sử dụng bởi nhiều mô hình nên được thực hiện như một hành vi. Tôi không biết nếu CodeIgniter có logic này hay không, nhưng nếu nó không, tôi sẽ cố gắng thực hiện nó như vậy. Bạn có thể đọc về các hành vi here.

(Các thành phần giúp bộ điều khiển chia sẻ logic và người trợ giúp giúp xem theo cùng một cách).

3

Mô hình là một phần của ứng dụng của bạn nơi logic kinh doanh diễn ra.Mô hình đại diện cho mối quan hệ thực tế và sự phụ thuộc giữa các đối tượng, như: Báo cáo nhân viên cho một Manager, Manager giám sát nhiều nhân viên, Manager có thể giao nhiệm vụ cho nhân viên, Task gửi thông báo khi quá hạn. Mô hình CAN và thường xuyên nhất DO giao diện với cơ sở dữ liệu, nhưng đây không phải là một yêu cầu.

Xem về cơ bản là mọi thứ có thể được hiển thị hoặc trợ giúp hiển thị. View chứa các khuôn mẫu, các đối tượng mẫu, xử lý các thành phần mẫu và làm tổ, kết thúc tốt đẹp với các đầu trang và chân trang, và tạo ra một trong các định dạng nổi tiếng (X/HTML, nhưng cũng là XML, RSS/Atom, CSV).

Bộ điều khiển là một lớp dịch thuật dịch các hành động của người dùng để lập mô hình hoạt động. Nói cách khác, nó cho mô hình biết phải làm gì và trả về một câu trả lời. Các phương thức điều khiển nên càng nhỏ càng tốt và tất cả các quy trình nghiệp vụ phải được thực hiện trong Mô hình, và xem xử lý logic sẽ diễn ra trong dạng xem.

Bây giờ, hãy quay lại câu hỏi của bạn. Nó thực sự phụ thuộc nếu bạn cần lớp riêng biệt cho mỗi sản phẩm. Trong hầu hết các trường hợp, một lớp sẽ đủ và 20 trường hợp của nó sẽ được tạo ra. Vì các sản phẩm đại diện cho logic nghiệp vụ nên nó thuộc về phần Mô hình của ứng dụng của bạn.

1

Cách đơn giản nhất là:

  1. Có một lớp mô hình cho mỗi bảng cơ sở dữ liệu. Trong trường hợp này, nó sẽ là một đối tượng chứa tất cả các chi tiết về sản phẩm.
  2. Đặt các lớp này vào một gói/namespace, ví dụ, com.company.model (Java/C#)
  3. Đặt các lớp DAO vào một gói phần mềm như com.company.model.dao
  4. xem bạn sẽ tiêu thụ dữ liệu từ phiên/yêu cầu/bộ điều khiển Trong trường hợp này, tôi sẽ có một Danh sách < Sản phẩm>.
  5. Ồ, bạn đang sử dụng PHP. Dunno làm thế nào mà thay đổi mọi thứ, nhưng tôi tưởng tượng nó có một khuôn khổ Bộ sưu tập giống như bất kỳ ngôn ngữ hiện đại nào.
1

@Alexander đề cập CakePHPs Hành vi, ComponentsHelpers. Đây là những tuyệt vời cho abstracting ra chức năng phổ biến. Tôi thấy những hành vi đặc biệt hữu ích như tất nhiên phần lớn logic kinh doanh được thực hiện trong các mô hình. Tôi hiện đang làm việc trên một dự án mà chúng tôi có các hành vi như:

  • có thể khóa
  • publishable
  • Tagable
  • có thể định giá
  • Commentable

, vv

Đối với mã vượt qua ngay cả khung MVC tức là mã li braries mà bạn sử dụng cho những thứ khác nhau mà không được gắn vào khung cụ thể bạn đang sử dụng - trong trường hợp của chúng tôi những thứ như các lớp mã hóa video vv CakePHP có các thư mục .

Mọi thứ không liên quan gì đến CakePHP đều có trong đó.

Tôi nghi ngờ CodeIgniter không có cấu trúc linh hoạt, nhỏ hơn và nhẹ hơn CakePHP, nhưng xem nhanh CakePHP Manual để xem cách Hành vi, Thành phần, Người trợ giúp và thư mục Nhà cung cấp có thể hữu ích. Cần phải có một số lớp trợ giúp thông thường từ các mô hình của bạn, hãy giữ nguyên và DRY

Các vấn đề liên quan