Drupal hoạt động như thế nào? [đóng cửa]


151

Ai đó có thể cung cấp một cái nhìn tổng quan về kiến ​​trúc của dòng điều khiển Drupal 7 không? Có lẽ theo nghĩa của một sơ đồ về cách tạo ra một trang. Những tài nguyên bổ sung nào bạn muốn đề xuất tư vấn liên quan đến cách thức hoạt động của Drupal?


1
Câu hỏi? Vậy thì tại sao bạn không tự hỏi nó :-)
liori

Tôi không nghĩ rằng có một cách tràn chồng trở lại sau đó. :)
Jeremy Pháp

2
Cộng đồng Drupal luôn tìm kiếm mọi người để giúp đỡ với tài liệu. Tại sao không giúp đỡ nếu tài liệu là vụng về hoặc hướng dẫn là khập khiễng? :)
Rimian

4
tài liệu đòi hỏi sự hiểu biết .. đòi hỏi tài liệu hoặc nhiều kinh nghiệm
Damon

Câu trả lời:


160

Drupal có thể gây nhầm lẫn ở mặt trước này, một phần vì nó có ngăn xếp chức năng tương đối sâu. Mặc dù đó là PHP theo thủ tục nhưng nó hoàn toàn là sự kiện / trình nghe được điều khiển trong kiến ​​trúc của nó và không có "dòng chảy" đơn giản nào trong tập lệnh PHP chính để bạn xem xét. Gần đây tôi đã trình bày về chính chủ đề này và các slide được đăng trên trình chiếu, nhưng một bản tóm tắt cấp cao nhanh chóng có thể hữu ích.

  • Chức năng tệp index.php của Drupal như một bộ điều khiển phía trước. Tất cả các trang được dẫn qua nó và url / đường dẫn "thực tế" mà người dùng yêu cầu được chuyển đến index.php dưới dạng tham số.
  • Hệ thống bộ định tuyến đường dẫn của Drupal (MenuAPI) được sử dụng để khớp đường dẫn được yêu cầu với một mô-đun plugin đã cho. Mô-đun plugin đó chịu trách nhiệm xây dựng "nội dung chính" của trang.
  • Khi nội dung trang chính được xây dựng, index.php gọi chủ đề ('trang', $ content), sẽ chuyển nội dung đến hệ thống theo chủ đề / skinning của Drupal. Ở đó, nó được bọc trong các thanh bên / tiêu đề / vật dụng / vv ..
  • Trang kết xuất sau đó được đưa trở lại apache và nó được gửi trở lại trình duyệt của người dùng.

Trong toàn bộ quá trình đó, các mô-đun plugin của Drupal và bên thứ ba đang thực hiện các sự kiện và lắng nghe họ phản hồi. Drupal gọi đây là hệ thống 'hook' và nó được triển khai bằng cách sử dụng các quy ước đặt tên hàm. Ví dụ, mô-đun 'blog' có thể chặn 'người dùng' liên quan bằng cách triển khai một chức năng có tên blog_user (). Theo cách nói của Drupal, đó gọi là hook_user () .

Hơi khó hiểu một chút, nhưng do một trò chơi PHP (nó giữ hàm băm bên trong của tất cả các chức năng được tải), nó cho phép Drupal nhanh chóng kiểm tra trình nghe chỉ bằng cách lặp qua danh sách các plugin đã cài đặt. Đối với mỗi plugin, nó có thể gọi function_exists () trên mẫu được đặt tên thích hợp và gọi hàm nếu nó tồn tại. ("Tôi đang kích hoạt sự kiện 'đăng nhập'. Có tồn tại chức năng 'mymodule_login' không? Tôi sẽ gọi nó. hoạt động khá tốt.

Mọi thứ xảy ra ở Drupal đều xảy ra do một trong những sự kiện đó bị sa thải. MenuAPI chỉ biết về các url / đường dẫn được xử lý bởi các mô-đun plugin khác nhau vì nó kích hoạt sự kiện 'menu' (hook_menu) và tập hợp tất cả các mô-đun plugin siêu dữ liệu đáp ứng. ("Tôi sẽ chăm sóc url 'news / Recent' và đây là chức năng gọi khi trang đó cần được xây dựng ...") Nội dung chỉ được lưu vì FormAPI của Drupal chịu trách nhiệm xây dựng trang và kích hoạt sự kiện 'một mẫu đã được gửi' để một mô-đun phản hồi. Bảo trì hàng giờ xảy ra vì hook_cron () được kích hoạt và bất kỳ mô-đun nào có mymodulename_cron () làm tên hàm sẽ có chức năng được gọi.

Mọi thứ khác cuối cùng chỉ là chi tiết - chi tiết quan trọng, nhưng biến thể về chủ đề đó. index.php là bộ điều khiển, hệ thống menu xác định "trang hiện tại" là gì và rất nhiều sự kiện được kích hoạt trong quá trình xây dựng trang đó. Các mô-đun plugin có thể nối vào các sự kiện đó và thay đổi quy trình làm việc / cung cấp thêm thông tin / v.v. Đó cũng là một phần lý do rất nhiều tài nguyên Drupal tập trung vào việc tạo ra các mô-đun. Không có mô-đun, Drupal thực sự không làm gì khác hơn là nói, 'Ai đó đã yêu cầu một trang! Nó tồn tại? Không? OK, tôi sẽ phục vụ 404. '


1
FWIW, có một chút khác biệt trong D7 (chủ đề ('trang') đã biến mất và các ký hiệu hiện được lưu trong bộ đăng ký mã), nhưng quá trình tổng thể vẫn giữ nguyên.
FGM

2
Eaton giải thích tuyệt vời, Cảm ơn bạn đã đi chơi ở đây. Câu hỏi của tôi cho bạn là, làm thế nào để bạn gỡ lỗi tất cả điều này, ngoài việc đặt var_dump trong mỗi mô-đun để tìm hiểu điều gì đã xảy ra?
Brian G

3
Câu hỏi hay. Nó phụ thuộc vào những gì bạn đang gỡ lỗi. Cài đặt mô-đun phát có thể giúp bạn bằng cách cung cấp cho bạn một số công cụ hữu ích. Bước (trong hầu hết các trường hợp) là xác định mô-đun nào chịu trách nhiệm xây dựng một trang nhất định. hook_menu () ánh xạ các url / đường dẫn đến các mô-đun, để có thể giúp đỡ. Sau đó, xác định những gì gọi lại trình đơn của nó đang làm - gọi drupal_get_form () để xây dựng một biểu mẫu hoặc chủ đề ('some_custom_thing') để xây dựng HTML, v.v. hãy xem để sử dụng các chức năng như drupal_alter () hoặc module_invoke_all () các mô-đun, quá ...
Eaton

Tôi thấy điều này siêu hữu ích. Bạn có biết Drupal 7 khác nhau như thế nào không?
Làm vườn

Cập nhật D7: (xem thêm) drupal.org/node/350780
dreftymac

63

Cơ chế phục vụ trang Drupal

Để hiểu cách thức hoạt động của Drupal, bạn cần hiểu cơ chế phục vụ trang của Drupal.

Nói tóm lại, tất cả các cuộc gọi / url / yêu cầu được phân phối bởi index.php, tải Drupal bằng cách bao gồm nhiều tệp / mô-đun khác nhau và sau đó gọi hàm thích hợp, được xác định trong mô-đun, để phục vụ yêu cầu / url.

Dưới đây là trích từ cuốn sách, Pro Drupal Development, giải thích quá trình bootstrap của Drupal,

Quá trình Bootstrap

Drupal tự khởi động theo mọi yêu cầu bằng cách trải qua một loạt các giai đoạn bootstrap. Các giai đoạn này được xác định trong bootstrap.inc và tiến hành như được mô tả trong các phần sau.

Khởi tạo cấu hình

Giai đoạn này cư trú mảng cấu hình bên trong của Drupal và thiết lập URL cơ sở ($ base_url) của trang web. Tệp settings.php được phân tích cú pháp thông qua include_once () và bất kỳ ghi đè biến hoặc chuỗi nào được thiết lập ở đó đều được áp dụng. Xem các phần ghi đè biến đổi của bộ dữ liệu và các phần ghi đè của bộ dữ liệu của các trang web tập tin / all / default / default.sinstall.php để biết chi tiết.

Cache trang sớm

Trong các tình huống đòi hỏi mức độ mở rộng cao, một hệ thống bộ đệm có thể cần phải được gọi trước khi kết nối cơ sở dữ liệu thậm chí còn được thử. Giai đoạn bộ đệm trang đầu cho phép bạn bao gồm (bao gồm ()) một tệp PHP có chứa một hàm gọi là page_cache_ fastpath (), sẽ tiếp quản và trả lại nội dung cho trình duyệt. Bộ đệm trang đầu được bật bằng cách đặt biến page_cache_fastpath thành TRUE và tệp được bao gồm được xác định bằng cách đặt biến cache_inc cho đường dẫn của tệp. Xem chương về bộ nhớ đệm cho một ví dụ.

Khởi tạo cơ sở dữ liệu

Trong giai đoạn cơ sở dữ liệu, loại cơ sở dữ liệu được xác định và kết nối ban đầu được thực hiện sẽ được sử dụng cho các truy vấn cơ sở dữ liệu.

Kiểm soát truy cập dựa trên tên máy chủ / IP

Drupal cho phép cấm các máy chủ trên cơ sở địa chỉ IP / tên máy chủ. Trong giai đoạn kiểm soát truy cập, kiểm tra nhanh được thực hiện để xem liệu yêu cầu có đến từ máy chủ bị cấm hay không; nếu vậy, truy cập bị từ chối.

Khởi tạo xử lý phiên

Drupal tận dụng khả năng xử lý phiên dựng sẵn của PHP nhưng lại ghi đè một số trình xử lý riêng để thực hiện xử lý phiên dựa trên cơ sở dữ liệu. Các phiên được khởi tạo hoặc thiết lập lại trong giai đoạn phiên. Đối tượng người dùng $ toàn cầu đại diện cho người dùng hiện tại cũng được khởi tạo ở đây, mặc dù về hiệu quả không phải tất cả các thuộc tính đều có sẵn (chúng được thêm bởi một lệnh gọi rõ ràng đến hàm user_load () khi cần).

Cache trang muộn

Trong giai đoạn bộ đệm trang muộn, Drupal tải đủ mã hỗ trợ để xác định xem có phục vụ trang từ bộ đệm trang hay không. Điều này bao gồm hợp nhất các cài đặt từ cơ sở dữ liệu vào mảng được tạo trong giai đoạn khởi tạo cấu hình và tải hoặc phân tích mã mô-đun. Nếu phiên cho biết rằng yêu cầu được đưa ra bởi người dùng ẩn danh và bộ đệm trang được bật, trang sẽ được trả về từ bộ đệm và dừng thực thi.

Xác định ngôn ngữ

Ở giai đoạn xác định ngôn ngữ, hỗ trợ đa ngôn ngữ của Drupal được khởi tạo và quyết định được đưa ra là ngôn ngữ nào sẽ được sử dụng để phục vụ trang hiện tại dựa trên cài đặt của người dùng và trang web. Drupal hỗ trợ một số lựa chọn thay thế để xác định hỗ trợ ngôn ngữ, chẳng hạn như tiền tố đường dẫn và đàm phán ngôn ngữ cấp tên miền.

Con đường

Ở pha đường dẫn, mã xử lý các đường dẫn và bí danh đường dẫn được tải. Giai đoạn này cho phép các URL có thể đọc được của con người được giải quyết và xử lý bộ đệm và tra cứu đường dẫn Drupal nội bộ.

Đầy

Giai đoạn này hoàn thành quá trình bootstrap bằng cách tải thư viện các hàm phổ biến, hỗ trợ chủ đề và hỗ trợ ánh xạ gọi lại, xử lý tệp, Unicode, bộ công cụ hình ảnh PHP, tạo và xử lý biểu mẫu, xử lý thư, bảng tự động sắp xếp và phân trang kết quả. Trình xử lý lỗi tùy chỉnh của Drupal được đặt và tất cả các mô-đun đã bật được tải. Cuối cùng, Drupal kích hoạt hook init, để các mô-đun có cơ hội được thông báo trước khi bắt đầu xử lý chính thức yêu cầu.

Khi Drupal đã hoàn thành bootstrapping, tất cả các thành phần của khung có sẵn. Đã đến lúc chấp nhận yêu cầu của trình duyệt và chuyển nó đến chức năng PHP sẽ xử lý nó. Ánh xạ giữa các URL và các chức năng xử lý chúng được thực hiện bằng cách sử dụng sổ đăng ký gọi lại, đảm nhiệm cả kiểm soát truy cập và ánh xạ URL. Các mô-đun đăng ký cuộc gọi lại bằng cách sử dụng móc menu (để biết thêm chi tiết, xem Chương 4).

Khi Drupal xác định rằng có tồn tại một cuộc gọi lại mà URL của trình duyệt yêu cầu ánh xạ thành công và người dùng có quyền truy cập vào cuộc gọi lại đó, quyền điều khiển được chuyển đến chức năng gọi lại.

Xử lý một yêu cầu

Hàm gọi lại thực hiện bất kỳ công việc nào được yêu cầu để xử lý và tích lũy dữ liệu cần thiết để thực hiện yêu cầu. Ví dụ: nếu nhận được yêu cầu về nội dung như http://example.com/ q = node / 3, thì URL được ánh xạ tới hàm node_page_view () trong node.module. Xử lý thêm sẽ lấy dữ liệu cho nút đó từ cơ sở dữ liệu và đưa nó vào cấu trúc dữ liệu. Sau đó, đã đến lúc theo chủ đề.

Sử dụng dữ liệu

Chủ đề liên quan đến việc chuyển đổi dữ liệu đã được truy xuất, thao tác hoặc tạo thành HTML (hoặc XML hoặc định dạng đầu ra khác). Drupal sẽ sử dụng chủ đề mà quản trị viên đã chọn để cung cấp cho trang web giao diện chính xác. Đầu ra kết quả sau đó được gửi đến trình duyệt web (hoặc ứng dụng khách HTTP khác).


20

Câu trả lời của Eaton cung cấp một cái nhìn tổng quan tốt. (Tôi mới ở đây vì vậy tôi không thể sửa đổi anh ấy, vì vậy bình luận.)

Khoảnh khắc "aha" tàn bạo đối với tôi là nhận ra mọi thứ xảy ra thông qua index.php, và sau đó qua thác mô-đun (cốt lõi trước, sau đó là theo trang web). Để mở rộng chức năng cốt lõi, đừng viết lại nó. Thay vào đó, sao chép mô-đun vào / trang web / tất cả / mô-đun / hoặc / trang web / [yoursite] / mô-đun và mở rộng THAT hoặc tạo mô-đun mới ở những nơi đó. Tương tự cho các chủ đề. Các thư mục mô-đun cũng có thể chứa mã hiển thị, dưới dạng tpl, css, v.v.

Nếu bạn đã quen với các kiểu khung MVC chặt chẽ hơn như Rails, Django, v.v. thì tất cả điều này sẽ gây ra một chút khó hiểu. Các mô-đun có thể trộn lẫn trong rất nhiều mã hiển thị và nếu bạn đang xem các mô-đun hoặc mẫu của người khác, cuối cùng bạn sẽ đi ngược trở lại qua ngăn xếp. Đó là vẻ đẹp / nỗi đau khi làm việc trong PHP.

Trớ trêu thay, "chỉ cần xây dựng một ứng dụng" có thể là cách tồi tệ nhất để tìm hiểu điều này. Drupal thực hiện quá nhiều thứ chỉ đơn giản là tối nghĩa cho đến khi bạn tìm ra luồng điều khiển. Chẳng có gì trong tệp tpl cho bạn biết một hàm có tên vui như l () đến từ đâu, chẳng hạn.


7

Nó phụ thuộc vào mức độ hiểu biết mà bạn đang tìm kiếm; nếu bạn có kiến ​​thức tốt về php, tôi khuyên bạn nên đọc qua chính mã, bắt đầu với index.php, sau đó tiếp tục đến tệp bao gồm / bootstrap.inc và sau đó là một số tập lệnh khác trong thư mục đó.

Khóa bao gồm các tệp:

  • menu.inc là rất quan trọng để hiểu làm thế nào hệ thống tổng thể hoạt động, vì nó xử lý rất nhiều ánh xạ ngầm định của URL đến nội dung.
  • common.inc có hầu hết các hàm bí ẩn khác tạo thành nền tảng của API.
  • module.inc xử lý các yêu cầu hook mà Eaton đã đề cập
  • form.inc giao dịch với hiển thị biểu mẫu, trình và xử lý
  • theme.inc xử lý trình bày.

Ngoài ra còn có một số chức năng chính trong các mô-đun / thư mục; đặc biệt, các mô-đun / nút / node.module tạo thành cơ sở của hệ thống nút, nói chung là những gì được sử dụng để đóng gói nội dung trang web.

Các mã nói chung, được nhận xét rất tốt và rõ ràng. Việc sử dụng đánh dấu Doxygen trong phần bình luận có nghĩa là mã có hiệu quả là tài liệu chính tắc.

Nó cũng giúp thực hiện điều này bằng cách sử dụng trình soạn thảo có thể nhanh chóng chuyển sang định nghĩa của hàm. Sử dụng vim kết hợp với ctags hoạt động cho tôi; bạn phải nói với ctags để lập chỉ mục các tệp .inc, .module, v.v. dưới dạng tệp php.


5

Tôi đã học được tải bằng cách nhập mã drupal .php vào dự án NetBeans. Sau đó, bạn có thể chạy trình gỡ lỗi netbeans và xem các giai đoạn khác nhau của trang kết hợp với nhau.


5

Những cuốn sách hay nhất về chủ đề này là "Pro Drupal Development" và "Sử dụng Drupal."

"Phát triển Drupal Pro" bao gồm một số sơ đồ đẹp và tóm tắt kỹ lưỡng về từng API của Drupal (biểu mẫu, chủ đề, v.v.). Nó được dự định đặc biệt hướng dẫn cho những người tạo ra các mô-đun và chủ đề của riêng họ, nhưng có nhiều giá trị cho nhà phát triển hiểu biết về PHP trung bình muốn hiểu Drupal. Ngoài ra, tôi đã tạo một mô-đun tùy chỉnh cho mọi trang web tôi đã xây dựng, chỉ để giành quyền kiểm soát bổ sung đối với những thứ như ẩn các trường trên các dạng khác nhau (mà bạn thường muốn làm để đơn giản hóa các hình thức nút cho mục đích cuối cùng người dùng), vì vậy thật tốt khi có kiến ​​thức này dưới mũ của bạn.

"Sử dụng Drupal" nhằm vào nhà phát triển trang web, những người muốn biết cách xây dựng những thứ tốt như phòng trưng bày, blog và các trang mạng xã hội. Nó đi qua một số trường hợp sử dụng và chỉ ra cách cấu hình các mô-đun hiện có để thực hiện từng công việc. Trong quá trình, nó giúp bạn làm quen với các mô-đun bổ trợ thiết yếu "Bộ công cụ xây dựng nội dung" (CCK) và "Chế độ xem", cách tạo các khối và mẫu tùy chỉnh và bảo trì trang web Drupal. Tôi giới thiệu cuốn sách này đặc biệt cho những ai muốn tăng tốc và thực sự SỬ DỤNG Drupal ngay lập tức. Trong quá trình bạn có được sự hiểu biết về tổ chức nội bộ của Drupal.


5

Cái này (cho Drupal 6) & cái này (cho Drupal 7) là một tổng quan kiến ​​trúc khá tốt về drupal. Nếu bạn muốn biết thêm chi tiết thì tôi sẽ bắt đầu viết một cái gì đó hầu hết các tài liệu là tốt. Cố gắng học nó ở mức độ chi tiết cao mà không có thứ gì cụ thể để đạt được sẽ khó khăn hơn nhiều khi thử một cái gì đó.


4

Người đóng góp mới ở đây, trễ 2 năm trong cuộc trò chuyện ;-)

Trả lời https://stackoverflow.com/a/1070325/1154755

Để mở rộng chức năng cốt lõi, đừng viết lại nó. Thay vào đó, sao chép mô-đun vào / trang web / tất cả / mô-đun / hoặc / trang web / [yoursite] / mô-đun và mở rộng THAT hoặc tạo mô-đun mới ở những nơi đó. Tương tự cho các chủ đề.

Trên thực tế, tôi không bao giờ phải sao chép một mô-đun cốt lõi để cập nhật nó. Móc Drupal nên là tất cả những gì bạn cần.

Đối với các chủ đề, vâng, đôi khi đó là cách duy nhất để đi, nhưng thông thường, bạn có thể xây dựng một chương trình con để có được kết quả bạn cần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.