2015-04-18 14 views
5

Tôi vừa bắt đầu xem xét mẫu MVC. Câu hỏi của tôi là:Cấu trúc PHP MVC nơi đặt các lớp riêng

Tôi sẽ đặt các tệp lớp khác của mình ở đâu (Cơ sở dữ liệu, Người dùng, Trình ghi nhật ký, Người gửi thư, v.v.)? Tôi có nên tạo một thư mục mới cho họ không, ví dụ: libs?

Tôi có nên khởi tạo các lớp học trong Controller bên trong chức năng model không?

<?php 

class Controller { 
    protected function model($model) { 
     require_once('../app/models/'. $model .'.php'); 

     return new $model(); 
    } 

    protected function view($view, $data = []) { 
     require_once '../app/views/'. $view .'.php'; 
    } 
} 
+0

Có vẻ như bạn đã từ bỏ việc nghiên cứu MVC và thay vào đó quyết định học Laravel. Vâng .. bất cứ điều gì trả tiền hóa đơn, tôi đoán, tôi trường hợp nếu bạn đã bao giờ nhận được một yêu cầu để bắt đầu tìm hiểu về MVC một lần nữa, bạn có thể đi qua các bài giảng và các tài liệu khác được liệt kê ở đây: http://stackoverflow.com/a/16356866/727208 –

Trả lời

2

Tôi sẽ đặt các tệp lớp khác của mình ở đâu (Cơ sở dữ liệu, Người dùng, Trình ghi nhật ký, Người gửi thư, v.v ...)? Tôi có nên tạo một thư mục mới cho họ không, ví dụ: libs?

Đặt chúng trong các tệp riêng biệt vì tất cả chúng đều cung cấp chức năng khác nhau sẽ không sao. Không có sự khác biệt trong việc đặt tên thư mục của bạn - miễn là nó khớp với các quy ước đặt tên của dự án hoặc chung của bạn (có thể, thậm chí tốt hơn).

Tôi có nên khởi tạo các lớp trong Bộ điều khiển bên trong chức năng mô hình không?

số Theo như tôi nhìn thấy nó, dòng chảy có thể là tương tự như:

  1. File index nhận được yêu cầu và khởi tạo một bootstrap dụ mới
  2. bootstrap bộ xử lý Throwable và bộ định tuyến
  3. router sau đó gọi phương thức tương ứng dựa trên phương thức yêu cầu và uri được cung cấp bằng cách khớp với tập hợp các tuyến đường
  4. Kết hợp route khởi tạo tất cả các thành phần của bộ ba MVC và phương thức có thể gọi. Các thành phần (Model lớp, View lớp và Controller lớp) được chuyển đến phương thức được gọi là router. Trong trường hợp của tôi, tôi gọi lớp FrontController, phương thức init.
  5. Về cơ bản, init là nơi thực hiện bộ ba MVC. Model lớp chịu trách nhiệm về logic nghiệp vụ, kiên trì, v.v.Điều quan trọng cần lưu ý là Model không phải là một tệp hoặc lớp duy nhất (giống với ViewController). Cả hai lớp ViewController đều tham khảo lớp Model để thực hiện các hành động tương ứng. Nhiệm vụ của View của lớp là quản lý đầu ra, ví dụ, quyết định thời gian đầu ra sẽ có Content-Type của application/json hoặc text/plain hoặc Template để hiển thị. Ngoài ra, Views không phải là Templates, có nghĩa là để hiển thị dữ liệu. Lưu ý ở đây, Views yêu cầu dữ liệu cần thiết trực tiếp từ lớp Model; không có sự tương tác với lớp Controller. Cuối cùng, Controller các bước của lớp khi cần có sự tương tác tương tác, ví dụ: người dùng gửi biểu mẫu, Controller lọc đầu vào tương ứng và gọi phương thức từ lớp Model.
+0

Bị bỏ phiếu vì: 1. ủng hộ tính toán trong một nhà xây dựng; 2. sử dụng các lớp tĩnh, 3 bộ điều khiển không xử lý giao tiếp (viewmodel trong MVVM nào); 4. đề nghị của bạn về việc làm một bộ điều khiển trong một đối tượng thần thực sự đáng lo ngại –

+0

@ tereško cập nhật. – sitilge

+1

vâng, đó là một cải tiến rõ ràng ... có một ý kiến –

1

Vì MVC có ba phần chính, tôi khuyên bạn nên (và nhận thấy rằng hầu như tất cả các khung trên thị trường) để tạo thư mục của từng thành phần và đặt các lớp vào thư mục phù hợp .

Như liên quan đến các thành phần khác, Database là một tiện ích và có thể được đặt ví dụ như trong một thư mục lib, User là một mô hình và có thể đi đến thư mục model, và Logger/Mailer cũng có thể vào thư mục lib. Đây là những ví dụ và không phải là một cái gì đó để tuân thủ nghiêm ngặt.

Để khởi tạo, mỗi Controller có thể xác định danh sách modelslibraries tùy thuộc và có khung MVC xử lý việc khởi tạo các đối tượng đó. Bạn sẽ làm theo mẫu dependency injection theo cách này.

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