2011-10-31 37 views
15

Tôi đang cố gắng dọn dẹp khung làm việc mà tôi đang nghiên cứu. Ngay bây giờ, các trang web bao gồm các thư mục sau:Cấu trúc thư mục cho MVC

Models 
Views 
Controllers 
Helpers (Miscellaneous functions) 
Libraries (Universal classes, like library and session management) 
Images 
Style 

Bất cứ lúc nào một trang được gọi là, kịch bản Router nhìn lên bộ điều khiển đi kèm, vì vậy thesite.com/login sẽ nhanh chóng Login_Controller tại '/ controllers/đăng nhập. php 'Vấn đề tôi đang đối mặt là, kịch bản router chính nó cảm thấy giống như một loại bộ điều khiển, cũng như view.php, xử lý dữ liệu định dạng sẽ được xử lý bởi khung nhìn thích hợp. Nhưng đây không phải là khá giống như bộ điều khiển trang, kể từ khi họ kiểm soát MVC chính nó. Tôi vẫn còn hơi mới với kiến ​​trúc này, và tôi tò mò làm thế nào một người có nhiều kinh nghiệm hơn sẽ tổ chức này.

Tôi có thể phân loại bộ định tuyến và xem bộ điều khiển dưới dạng thư viện hay tốt hơn để tạo thư mục con bên trong/bộ điều khiển được gọi là 'trang' hoặc bất kỳ ý tưởng nào khác? Cám ơn rất nhiều.

+1

Thông thường các thư mục bạn liệt kê ở trên sẽ nằm trong một thư mục có tên là 'ứng dụng', và mã thực sự chạy khung của bạn sẽ được lưu trữ trong thư mục riêng của nó được gọi là 'cốt lõi'. –

+0

Bạn cũng có thể muốn di chuyển hầu hết điều này ra khỏi thư mục công cộng của mình và sử dụng đường dẫn bao gồm để lấy tệp. Tôi giả định rằng nó nằm trong một thư mục công cộng hiện tại vì thư mục Kiểu và Hình ảnh. – dqhendricks

+0

Vì vậy, tôi sẽ có mô hình, xem, điều khiển thư mục trên trang gốc, và sau đó/ứng dụng/điều khiển cho router.php và view.php? Chỉ cần tự hỏi những gì được coi là tiêu chuẩn, nếu bất cứ điều gì. – dlwiest

Trả lời

8

tôi sẽ đề nghị đi theo Symfony 1.x cấu trúc thư mục. Rõ ràng, hợp lý, an toàn.

Trích từ cuốn sách "The definitive guide to Symfony" bởi Fabien Potencier & François Zaninotto:

apps/ 
    frontend/ 
    backend/ 
cache/ 
config/ 
data/ 
    sql/ 
doc/ 
lib/ 
    model/ 
log/ 
plugins/ 
test/ 
    bootstrap/ 
    unit/ 
    functional/ 
web/ 
    css/ 
    images/ 
    js/ 
    uploads/ 
  • apps/ Chứa một thư mục cho mỗi ứng dụng của dự án (thông thường, frontend và phụ trợ cho phía trước và back office).
  • bộ nhớ cache/ Chứa phiên bản được lưu trong bộ nhớ cache của cấu hình và (nếu bạn kích hoạt) phiên bản bộ nhớ cache của các hành động và mẫu của dự án. Cơ chế bộ nhớ cache (chi tiết trong Chương 12) sử dụng các tệp này để tăng tốc độ trả lời cho các yêu cầu web. Mỗi ứng dụng sẽ có một thư mục con ở đây, chứa các tệp PHP và HTML đã được xử lý trước.
  • config/ Giữ cấu hình chung của dự án.
  • dữ liệu/ Ở đây, bạn có thể lưu trữ các tệp dữ liệu của dự án, như lược đồ cơ sở dữ liệu, tệp SQL tạo bảng hoặc thậm chí tệp cơ sở dữ liệu SQLite.
  • doc/ Lưu trữ tài liệu dự án, bao gồm tài liệu của riêng bạn và tài liệu được tạo bởi PHPdoc.
  • lib/ Dành riêng cho các lớp học hoặc thư viện nước ngoài. Tại đây, bạn có thể thêm mã cần để chia sẻ giữa các ứng dụng của mình.mô hình/ thư mục con lưu trữ mô hình đối tượng của dự án (được mô tả trong Chương 8).
    • log/ Lưu trữ các tệp nhật ký áp dụng được tạo trực tiếp bởi symfony. Nó cũng có thể chứa tệp nhật ký máy chủ web, tệp nhật ký cơ sở dữ liệu hoặc tệp nhật ký từ bất kỳ phần nào của dự án. Symfony tạo một tệp nhật ký cho mỗi ứng dụng và mỗi môi trường (tệp nhật ký là được thảo luận trong Chương 16).
  • plugins/ Stores các plugin được cài đặt trong ứng dụng (plugin được thảo luận trong Chương 17).
  • kiểm tra/ Chứa các bài kiểm tra đơn vị và chức năng viết bằng PHP và tương thích với khung kiểm tra symfony (được thảo luận trong Chương 15). Trong quá trình thiết lập dự án, symfony tự động thêm một số sơ đồ với một vài bài kiểm tra cơ bản.
  • web/ Gốc cho máy chủ web. Các tệp duy nhất có thể truy cập từ Internet là các tệp nằm trong thư mục này.
+0

Liên kết đã chết. – Mike

+0

Cảm ơn thông tin Mike; cập nhật câu trả lời của tôi + sao chép/dán/định dạng đoạn trích có liên quan từ tài liệu gốc –

6

Tôi sẽ không gọi bản thân mình là chuyên gia nhưng một giải pháp sẽ là di chuyển 'khung' của bạn khỏi việc triển khai. Ý tôi là di chuyển 'router', 'view.php' và các lớp khung công tác khác đến một số vị trí bên ngoài mà bạn đưa vào index.php hoặc bất kỳ tệp nào sẽ là điểm truy cập của bạn.

Sau đó, chỉ nội dung nằm trong thư mục ứng dụng thực của bạn trong khi tất cả các tệp khuôn khổ sẽ ở một vị trí không thể truy cập qua máy chủ web.

Chỉ cần một ý tưởng :)

18

tôi sẽ đề nghị bạn để nghiên cứu cấu trúc thư mục của một khuôn khổ, như symfony2 hoặc yii

ở đây là những gì tôi đã chọn cho tôi:

public_html/    (for public files) (should be public, place only index.php in here) 
public_html/css/ 
public_html/images 
public_html/js   (for your js files, or custom generated ones) 
lib/      (for my libs) (should be private) 
lib/vendor/    (for 3rd party libs) 
application/    (for the whole app) (should be private) 
application/class   (classes that make the app work such as mainApp, Controller, Model, View, etc...) 
application/class/model (all the models) 
application/class/view (all the views) 
application/class/view/html (templates used by the views) 
application/class/controller (all controllers) 
application/class/helper (helper functions) 
application/class/lib  (libs that you develop for the application) 
application/template  (layout and/or templates for the application) 
application/conf   (config files) 
application/log   (log files) 
application/cron   (scheduled jobs) 
application/database  (for database migration scripts) 
... 

Bạn cũng có thể sử dụng tập tin quy ước đặt tên, chẳng hạn như: YourClassName.class.php cho các clases, YourView.phtml cho các khung nhìn của bạn, vv Kiểm tra một khung công tác và bạn sẽ học cách cấu trúc độc đáo và ứng dụng.

+0

Cảm ơn bạn, điều đó rất hữu ích. Tôi giả sử view.php sẽ đi vào/xem, và sau đó tất cả các phần còn lại của các tập tin mẫu sẽ đi vào/view/html, nhưng nơi bạn sẽ khuyên bạn nên đặt router.php? Đó là khá nhiều điểm vào phần còn lại của hệ thống. – dlwiest

+0

cho router tôi sử dụng /index.php, đó là bootstrapper, bên trong nó sử dụng một thể hiện ngoài lớp mainApp, quản lý bất kỳ "hoạt động toàn cầu" (định tuyến, bộ nhớ đệm, yêu cầu điều khiển, ghi nhật ký, lỗi) ... mặc dù tôi làm công cụ định tuyến thông qua mô-đun mod_rewrite của apache –

+0

về chế độ xem ... nhưng bạn đang chỉnh sửa câu trả lời của tôi để nó hiển thị rõ ràng hơn những gì tôi định giải thích –

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