Tôi chỉ tìm thấy những thông tin còn thiếu.
EDIT: Và một số khác.
Sự cố với module_invoke ()
module_invoke_all()
luôn gọi module_implements()
, kiểm tra mô-đun bao gồm tệp bằng cách kiểm tra cả hai hook_hook_info()
và hook_module_implements_alter()
.
Tuy nhiên, module_invoke()
chỉ kiểm tra hook_hook_info()
và không hook_module_implements_alter()
.
module_invoke()
được gọi là ví dụ trong _block_render_blocks()
cho hook_block_view()
. Điều này có nghĩa là đó hook_module_implements_alter()
không phải là một giải pháp tốt để phân chia hook_block_view()
việc thực hiện thành một tệp riêng biệt.
Đây là một vấn đề trong Crumbs, xem https://www.drupal.org/node/2328535 .
Đối với các hook khác, nó thường hoạt động tốt, nhưng bạn không bao giờ biết nếu một mô-đun cụ thể muốn sử dụng module_invoke()
thay vì module_invoke_all()
.
bộ đệm module_implements () bị ô nhiễm trong bootstrap.
Một vấn đề khác là do một vấn đề cốt lõi được báo cáo ở đây:
module_implements_cache () có thể bị ô nhiễm bởi việc triển khai hook_boot () gọi module_invoke_all () trực tiếp hoặc gián tiếp
Điều này chỉ áp dụng cho các mô-đun không khởi động , trong đó có thể xảy ra việc triển khai hook_module_implements_alter()
không bao giờ được phát hiện.
- Một chuỗi các sự kiện bất ngờ gây ra
module_implements($hook)
được gọi từ hook_boot()
.
Có $hook
thể là bất kỳ hook ngẫu nhiên nào, nó không cần liên quan đến mô-đun chúng tôi đang làm việc.
- Điều này gây ra
module_implements('module_implements_alter')
được gọi là.
- Drupal tìm kiếm tất cả các triển khai
hook_module_implements_alter()
. Tại thời điểm này, MODULENAME.module
chưa được bao gồm.
Do đó, đối với phần còn lại của yêu cầu, Drupal cho rằng việc thực MODULENAME_module_implements_alter()
hiện không tồn tại.
- Sau đó trong yêu cầu, việc triển khai các hook khác đang được phát hiện, nhưng các triển khai của MODULENAME không được tìm thấy, vì
MODULENAME_module_implements_alter()
không được thực thi.
Lựa chọn thay thế
Yêu cầu
Các lựa chọn thay thế đã được đề cập. Thay vì những thủ thuật này, người ta có thể bao gồm các tập tin trực tiếp. Có thể có một tác động hiệu suất nhỏ nhưng điều này có lẽ bị lu mờ bởi rất nhiều thứ khác trong Drupal.
Nhưng, thay vì sử dụng module_load_include()
, tôi sẽ đề xuất một giải pháp trực tiếp hơn:
require_once __DIR__ . '/crumbs.block.inc';
Hoặc để tương thích với PHP 5.2:
require_once dirname(__FILE__) . '/crumbs.block.inc';
Tại sao không phải module_load_include ()?
Nói chung, không cần phải gọi module_load_include()
, thậm chí có thể gây bất lợi, nếu tệp * .module được bao gồm từ bạn không biết (ví dụ từ settings.php
) và bạn không biết nếu module_load_include()
có sẵn.
Chức năng này chủ yếu ở đó để giúp bạn xác định vị trí của các mô-đun khác . Nhưng nếu bạn bao gồm trong cùng một mô-đun , thường sẽ an toàn hơn và dễ dàng hơn và nhanh hơn để làm việc với các đường dẫn tệp tương đối và rõ ràng require_once
.
Gọi để trợ giúp chức năng
Như Jimajamma đã đề cập, bạn cũng có thể thực hiện hook trong *.module
tệp chính , sau đó bao gồm một tệp khác và gọi một hàm trợ giúp từ đó. Điều này được thực hiện, ví dụ như trong bộ Display.
Giải pháp này là ổn, mặc dù tôi nghĩ rằng nó vẫn đóng tập tin chính và cung cấp cho bạn nhiều nơi hơn để tìm.
Và ở đây cũng vậy, bạn có thể sử dụng allow_once thay vì module_load_include()
, nếu nó nằm trong cùng một mô-đun.