Tương đương với module_load_include () là gì?


7

Tôi có nhiều kinh nghiệm với D7 nhưng không nhiều với D8, vì vậy tôi đang tự hỏi về cách làm việc D8 "đúng đắn" ở đây.

Vì vậy, tôi đã có ModuleA và ModuleB

ModuleB phụ thuộc vào ModuleA.

Tôi cần gọi một hàm từ ModuleA bên trong ModuleB.

Trong D7, điều này được thực hiện bởi module_load_include () và D8 dường như có cả chức năng này cũng như lớp ModuleHandler.

Tôi đang cố gắng khởi tạo lớp này và sử dụng phương thức tải, nhưng nó đang gây ra lỗi vì tôi không truyền gì cho hàm tạo:

$ module_handler = new \ Drupal \ Core \ Extension \ ModuleHandler; $ module_handler-> tải ('ilib_connect');

TypeError: Argument 3 passed to Drupal\Core\Extension\ModuleHandler::__construct() must implement interface Drupal\Core\Cache\CacheBackendInterface, none given, called in /var/www/company/web/modules/custom/ilib_sso/ilib_sso.module on line 31 in Drupal\Core\Extension\ModuleHandler->__construct() (line 109 of core/lib/Drupal/Core/Extension/ModuleHandler.php).

Vì vậy, hiện tại tôi không chuyển bất cứ thứ gì cho hàm tạo (không chắc chắn chính xác sẽ truyền gì) và gọi phương thức tĩnh không phải là vấn đề, bởi vì phương thức load () tham chiếu đến đối tượng của nó và do đó gây ra lỗi này:

Error: Using $this when not in object context in Drupal\Core\Extension\ModuleHandler::load() (line 122 of core/lib/Drupal/Core/Extension/ModuleHandler.php).

Vì vậy, làm thế nào tôi có thể sử dụng lớp đặc biệt này? Hay tôi chỉ nên sử dụng module_load_include ()?

Drupal 8 cách làm việc là gì?


Vì vậy, bạn cần gọi mã thủ tục từ Mô-đun A từ mã thủ tục của Mô-đun B và mã của Mô-đun A có bao gồm không?
mpdon Arena

Trình xử lý mô-đun là một dịch vụ; sử dụng \Drupal::moduleHandler()hoặc tiêm vào lớp nhận biết vùng chứa của riêng bạn để có phiên bản được khởi tạo hoàn toàn
Clive

sử dụng \ Drupal :: ModuleHandler (); dường như đang ném một lỗi cú pháp.
Jack Ryan

1
Chỉ \Drupal::moduleHandler()->loadInclude($foo, $bar);, ("sử dụng" là một phần của văn bản trong bình luận cuối cùng đó, không phải mã, có thể hiểu tại sao nó khó hiểu)
Clive

1
Lưu ý: Mặc dù nó vẫn tồn tại, nên có rất ít lý do để vẫn phải sử dụng nó trong 8.x. Chỉ cần thiết nếu một mô-đun có chức năng (api) trong một tệp riêng biệt không được tải tự động. Điều này không nên được thực hiện nữa, đó là những dịch vụ dành cho 8.x. Âm thanh giống như một mô-đun chưa được chuyển hoàn toàn sang các khái niệm 8.x hoặc được viết bằng các khái niệm 7.x.
Berdir

Câu trả lời:


6

Câu trả lời là phương thức tải không phải là phương thức đúng và có một phương thức loadInclude () cụ thể.

\Drupal::moduleHandler()->loadInclude('ilib_connect', 'module');

2
ModuleHandler::loadIncludekhông tĩnh, bạn không nên gọi nó một cách tĩnh, thực tế là bạn có thể chỉ là tàn dư của PHP cũ, nó sẽ tạo E_STRICT trong PHP5, có thể tệ hơn trong 7. Ngoài ra từ phía Drupal, nó có thể khiến bạn không vấn đề bây giờ, nhưng nếu việc triển khai thay đổi (ví dụ để sử dụng $this), nó có thể khiến bạn thất vọng trong tương lai. Đưa phiên bản dịch vụ vào bối cảnh hiện tại của bạn là cách tốt nhất
Clive

1
Được rồi, tôi sẽ xóa cái này sau đó.
Jack Ryan

2
Hoặc bạn chỉ có thể chỉnh sửa nó, phương pháp chính xác của container là:\Drupal::moduleHandler()->loadInclude($foo, $bar);
Clive
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.