2009-09-07 42 views
24

Tôi đang tạo một trang web dựa trên PHP MVC rất lớn sẽ có một thư viện lớn gồm các lớp php, javascripts và nhiều tệp css (chưa kể một lượng lớn tệp cho MVC).Cấu trúc thư mục dựa trên PHP có khả năng mở rộng nhất cho một trang web lớn là gì?

Lần đầu tiên, tôi thực sự dành thời gian lên kế hoạch cho một cấu trúc thư mục sạch sẽ và có tổ chức.

Bạn thường sử dụng cấu trúc thư mục nào và cách nào dễ nhất để quản lý khi có hàng nghìn tệp?

+0

Đây chỉ là một suy nghĩ. Bạn đã cân nhắc sử dụng một khung công tác MVC PHP đã tồn tại, chẳng hạn như CakePHP chưa? Tôi hiểu rằng có thể có một đường cong học tập, nhưng nó có thể là đáng giá để xem xét những lợi ích của một khung nguồn mở, phổ biến. Tôi đã xây dựng và duy trì mã riêng của mình trong nhiều năm, nhưng nhận thấy rằng nó có khả năng mở rộng hơn để sử dụng khung bên thứ ba, đặc biệt là cho các trang web lớn. Bạn có thể thấy rằng nó sẽ giúp bạn tiết kiệm thời gian trong thời gian dài, và bạn sẽ có các kỹ năng quý giá cho các dự án gia công phần mềm trong tương lai. – Dooltaz

+2

Tôi thực sự đã nghĩ về điều đó ... và tôi có thể sử dụng một cách dứt khoát ... nhưng tôi phải tự mình làm điều đó trước khi tôi có thể tiếp tục :) một điều thần kinh ha – johnnietheblack

Trả lời

21

Đây là thiết lập của tôi. Nó làm việc tuyệt vời cho tôi cho các dự án nhỏ - rất lớn (bao gồm cả mạng xã hội).
Các thư mục này tất cả sẽ sống trong chính thư mục ứng dụng của tôi:

  • config - chứa các tập tin tùy chỉnh cấu hình PHP
  • css - chứa các tập tin CSS của dự án
  • người giúp đỡ - có chứa 'helper' tệp (mỗi tệp là một tập hợp các chức năng)
  • hình ảnh - chứa hình ảnh của dự án
  • js - chứa các tập tin javascript của dự án
  • lib - chứa các lớp PHP cụ thể cho dự án
  • module - khung MVC tôi cho phép các phần trang web đóng gói dạng module
    • blog - Một ví dụ mô-đun
      • bộ điều khiển - chứa bộ điều khiển cho mô-đun
      • .210
      • mô hình - chứa các mô hình cho các mô-đun
      • views - chứa các quan điểm đối với các mô-đun
  • views - chứa quan điểm rằng nên có thể truy cập trên toàn cầu (tiêu đề trang, chân trang, vv)

Tất cả các thư mục rõ ràng có thể chứa các thư mục con sẽ tổ chức thêm tệp của bạn. Ví dụ: thư mục 'css' có thể có các thư mục con có tên 'web' và 'di động'. Thư mục 'hình ảnh' có thể chứa thư mục 'user_uploaded', sau đó có thể chứa '' cấu hình ''. Và tất nhiên bạn có thể thêm các thư mục như bạn thấy phù hợp, trong một dự án tôi có một thư mục gọi là 'người tải lên' chỉ chứa các tập lệnh tải lên độc lập.

Tôi cũng sử dụng các phương pháp tiện lợi giúp xây dựng tên tệp của những gì tôi muốn tải. Ví dụ, loadView của tôi() sẽ tìm kiếm tập tin xem trong thư mục module hiện tại, hoặc nếu bạn vượt qua một đối số $ module tùy chọn, nó sẽ trông cụ thể trong thư mục của mô-đun đó.

Tôi hy vọng điều này sẽ hữu ích.

+2

Điều này có nghĩa là tất cả các mã php, cấu hình, v.v. sẽ hiển thị cho tất cả mọi người trừ khi bạn thực hiện một số phép thuật máy chủ với một cái gì đó như .htaccess – OIS

+1

OIS là chính xác. Trong thiết lập này, nếu ai đó biết tên tệp, họ có thể gọi nó từ trình duyệt. Tôi đã đăng câu trả lời này trước khi chuyển sang Symfony (ẩn tất cả các tệp nền) và tôi chắc chắn khuyên bạn nên di chuyển tất cả các tệp không công khai bên ngoài quyền truy cập web công cộng. –

+1

'lib - chứa các lớp PHP cụ thể cho dự án 'Bạn có nghĩa là" không cụ thể "ở đây không? Tôi sẽ nghĩ rằng lib là cho những thứ bạn viết đó là chung và/hoặc cho các thư viện hiện tại thực tế mà bạn sử dụng. Ngoài ra, tôi tò mò - bạn nghĩ gì về các thư mục 'js' và' css' như mô-đun đi? Bạn có chia nhỏ thư mục 'js' thành lib & modules theo cách tương tự không? –

5

Đối với các file lõi được bao gồm: approot/inc/

Đối với chức năng truy cập dữ liệu và các lớp học đang ở: approot/dao/

Đối javascripts: approot/scripts/

Đối với CSS: approot/styles/

Đối với hình ảnh: approot/img/

Đối với nội dung tĩnh (thường là cho hình ảnh hồ sơ cá nhân của người dùng hoặc hình ảnh tải lên): approot/static/

Đối với cache: approot/cache/

Đối với các mẫu hoặc Xem file: approot/templates/

Tất cả các trang file: approot/

cấu trúc từ Samstyle PHP Framework


Câu trả lời tôi đăng ở đây là từ năm 2009. Qua nhiều năm, các tiêu chuẩn đã được xuất bản, bao gồm PSR-0 bao gồm chủ đề về cấu trúc thư mục. Tôi cũng có cấu trúc thư mục mới (và tôi cảm thấy rằng nó tốt hơn) với Packfire Framework.

+0

tại sao điều này lại xảy ra được bỏ phiếu xuống? – johnnietheblack

+1

không có ý tưởng. cũng rất muốn tìm hiểu từ cử tri. – mauris

+0

@mauris bạn vẫn sử dụng cấu trúc này? –

4

Theo kinh nghiệm của tôi, bạn không bao giờ có thể lên kế hoạch cho việc này. Bạn có thể cố gắng làm theo những gì khuôn khổ làm, nhưng tôi thấy tôi không bao giờ hoàn toàn phù hợp chính xác vào khuôn của họ.

Tôi khuyên bạn chỉ nên giữ nguyên quy tắc chung cho 20 tệp trong một thư mục tối đa. Nếu bạn tìm thấy bạn cần nhiều hơn, chỉ cần tạo một vài thư mục con và di chuyển các thành phần phổ biến trong đó.

+0

ý tưởng thú vị về việc học từ các khung công tác ... nhưng một số ý tưởng tốt là gì và tôi tìm thấy cấu trúc của chúng ở đâu? cảm ơn! – johnnietheblack

2

Tôi sử dụng trình viết mã cho các dự án lớn và nhỏ. Tính năng MVC của nó khá tốt.

  • CodeIgniter \ system \ ứng dụng \ config: chứa tất cả các loại file cấu hình như DB, cổng thanh toán, ftp cấu hình, các tuyến đường và ...
  • CodeIgniter \ system \ ứng dụng \ mô hình: chứa tất cả các loại cơ sở dữ liệu các lớp học, bạn nên tạo thư mục con theo nhu cầu của bạn, tôi đã sử dụng khách hàng, mailData, paymentModel, báo cáo, dịch vụ web và ....
  • codeIgniter \ system \ application \ views: chứa tất cả các loại tệp sẽ hoạt động như đầu ra cho khách hàng, bạn nên nghĩ đến việc sử dụng lại các tệp này nếu có thể. Giống như các mô hình bạn đã tạo thư mục con như quản trị, báo cáo, email, email_template .....
  • codeIgniter \ system \ application \ controllers: đây là phần quan trọng nhất. Điều này sẽ giúp tạo ra SEO url, vì vậy bạn nên cẩn thận hơn về các thư mục con lần này. Bạn có thể tạo ra như quản trị, sản phẩm, báo cáo, đơn đặt hàng ..... và xem xét một tên tốt cho các chức năng của lớp điều khiển.

Đây là các tệp PHP/HTML.

Bây giờ về các tập tin khác:

  • CodeIgniter \ images: cho những hình ảnh
  • CodeIgniter \ scripts: cho các kịch bản Java và khuôn khổ của họ
  • CodeIgniter \ phong cách: cho CSS
  • codeIgniter \ uploads: đối với các tệp đã tải lên, nếu bạn không muốn đặt tệp trong DB

Để biết chi tiết, hãy xem mã Igniter framework cụ thể.

Here "CodeIgniter \" là approot

+0

Tôi có thể đặt index.php trong thư mục web root và phần còn lại của PHP trong bộ điều khiển không? Cảm ơn trước. –

18

Bạn nên có một thư mục như là người chủ web, nơi duy nhất tập tin mà bạn muốn tiếp xúc với toàn bộ internet nên cư trú.

project/ 
web/ 
    index.php 
    css/ 
    js/ 
    images/ 
config/ 
lib/ 
  • web/là gốc rễ cho thấy khách
  • lib/là ở đây thư mục thư viện, và ở đâu autoload nhìn cho các tập tin.

Bạn có thể thêm nhiều thư mục con khác vào dự án/như bộ điều khiển, mô-đun, chế độ xem, trình trợ giúp, v.v. Điều này phụ thuộc vào khung của bạn.

EDIT:

Nếu bạn sử dụng nhà soạn nhạc (mà tôi đề nghị) và có thể NPM với grunt và ít cấu trúc tập tin của bạn sẽ được như sau:

project/ 
    web/ 
     js/ 
     css/ 
     images/ 
     index.php 
    cli/ 
    config/ 
     config.php 
    node_modules/ 
    src/ 
    test/ 
    vendor/ 
    composer.json 
    composer.lock 
    packages.json 
  • web/có tất cả của bạn các tệp công khai
  • cli/tập lệnh và chương trình được chạy từ dòng lệnh KHÔNG phải là web
  • cấu hình/có tất cả đồng nghiệp của bạn Các tệp nfig (trong git bạn bỏ qua config.php và thay vào đó có config.dist.php không có tên người dùng, mật khẩu, mã xác nhận và tiền tố/hậu tố và "bí mật" khác)
  • node_modules/có tất cả các tệp thư viện của bạn từ npm (trong git tôi đề nghị bạn đặt điều này trong một submodule)
  • src có tất cả các file PHP địa phương của bạn trong cấu trúc psr4, thiết lập để tự động load trong composer.json
  • thử nghiệm/có tất cả các bài kiểm tra đơn vị của bạn cho các lớp src của bạn, thiết lập trong autload-dev trong composer.json (nhớ sử dụng composer install --no-dev trực tiếp, có thể thêm -o nếu bạn không có quá nhiều lớp)
  • nhà cung cấp có tất cả các tệp thư viện của bạn từ nhà soạn nhạc và ONE và ONLY autoload.php được đưa vào web/chỉ mục.php và bất kỳ kịch bản cli nào (trong git tôi đề nghị bạn bỏ qua thư mục nhà cung cấp này)

Thêm các thư mục và tệp khác theo yêu cầu cho dự án của bạn.

Để sử dụng triển khai cấu trúc này:

/sites/project/ (project is your projectname) 
    current (alias to current release folder releases/v1.1.0) 
    previous (optional alias to previous release folder releases/v1.0.1) 
    releases/ 
     v1.0.0/ (git checkout of tag v1.0.0) 
     v1.0.1/ (git checkout of tag v1.0.1) 
     v1.1.0/ (git checkout of tag v1.1.0) 
    shared/ (has all your shared files and folders to be aliased in all releases - maybe something like GlusterFS) 

Thực hiện một kịch bản triển khai. Một cái gì đó như thế này:

Sao lưu dự phòng đầu tiên của db hoặc sao chép nó vào cơ sở dữ liệu mới, thanh toán git repo vào thư mục mới với thẻ phát hành, nhận tất cả các mô-đun con, chạy trình soạn nhạc --no-dev, thiết lập bất kỳ bí danh nào các thư mục và tệp được chia sẻ như tệp hình ảnh và tệp cấu hình đã tải lên, tạo ra js/css với grunt và ít hoặc tương đương, trỏ bí danh hiện tại vào thư mục mới bằng thẻ, chạy tập lệnh cơ sở dữ liệu cập nhật, khởi động lại dịch vụ nginx/apache/fpm-php, chạy thử nghiệm để kiểm tra trang web đã hết.

Có tập lệnh để quay lại phiên bản trước (hoặc hướng dẫn để bạn biết phải làm gì).

+0

Sạch sẽ và đơn giản nhưng thiếu hai thư mục quan trọng: 'project/tests /' và 'project/class /' (để thư mục 'lib' có thể được sử dụng cho thư viện của bên thứ ba). Có thể là bạn mọi người có những gợi ý khác cho cấu trúc bên thối? – Wernight

0

Tôi tin rằng điều này phụ thuộc vào dự án sẽ lớn đến mức nào. Đây là những gì tôi sử dụng chủ yếu:

dự án/
    index.php
    img/
    css/
    js/
    views/
    chức năng/

Miễn là tất cả e tệp dự án được tổ chức ...

0

Đây chủ yếu là vấn đề ưu tiên, tìm kiếm nhanh trên Google sẽ tiết lộ nhiều cấu trúc dự án khác nhau. Nhưng nó sẽ thực sự tốt đẹp nếu có một tiêu chuẩn thỏa thuận. Tôi nghĩ rằng điều này initiative bởi các tiêu chuẩn phát triển gói PHP là một ứng cử viên tốt.

Đây là cấu trúc thư mục họ đề nghị:

  • bin/: dòng lệnh thực thi
  • config/: file cấu hình
  • docs/: file tài liệu
  • công khai/: tệp máy chủ web
  • nguồn/: tập tin tài nguyên khác
  • src/: mã nguồn PHP
  • kiểm tra/: mã kiểm tra
0

Đây là cấu trúc tôi hiện đang sử dụng,

public/   
    assets/   /* js, css, imgs, ... */ 
    index.php 
src/ 
    config/   /* for config files */ 
    helpers/  /* for functions */ 
    libraries/  /* for free classes that are not MVC classes */ 
    models/   /* for M in MVC */ 
    views/   /* for V in MVC */     
    controllers/ /* for C in MVC */ 
    vendor/   /* for vendors files */ 
    uploads/  /* for uploaded images, docs, ... */ 
Các vấn đề liên quan