Tôi hiện đang làm việc trên một mô-đun yêu cầu thư viện PHP của bên thứ ba, về cơ bản là một lớp PHP. Thông thường, tôi sẽ đặt nó trong một thư mục bao gồm / thư mục con và thêm
files[] = includes/Foo.php
vào tập tin .info của tôi và để trình tải tự động lớp Drupal 7 thực hiện công việc của nó khi tôi làm a $foo = new Foo()
.
Tuy nhiên, tôi được phép phát hành mô-đun này ra công chúng và thà không bao gồm thư viện với mô-đun. Tôi nhận thức rõ về các vấn đề phức tạp liên quan đến cấp phép, nhưng vì câu hỏi này, tôi muốn bỏ qua nó.
Có một câu hỏi tương tự, Làm thế nào để tôi bao gồm một thư viện PHP? , nhưng tôi không thực sự nghĩ rằng điều này trả lời tình trạng khó xử của tôi.
Câu trả lời này cho câu hỏi này về cơ bản nói là sử dụng API Thư viện , nhưng mỗi mô-đun duy nhất mà tôi đã tìm thấy sử dụng điều này chỉ libraries_get_path()
để lấy basepath (và bao gồm đường dẫn dự phòng khi không có sẵn) và sau đó thực hiện một require
hoặc include
với một số kiểm tra lỗi (hoặc không). Tất cả làm một cái gì đó như:
if (!class_exists('Foo')) {
$path = function_exists('libraries_get_path') ?
libraries_get_path('foo') : 'sites/all/libraries/foo';
if (!include($path . '/Foo.php')) {
// handle this error
}
}
Trong trường hợp này, API Thư viện không thực sự làm gì cả. Tôi không thấy lợi thế khi sử dụng phương pháp này, qua phương pháp cũ là yêu cầu người dùng tải xuống một bản sao và đặt nó vào thư mục mô-đun. Và, vẫn còn vấn đề mà nhà phát triển mô-đun vẫn cần thực hiện tải bằng tay với include
/ require
. Ví dụ: mô-đun Facebook chỉ tải thư viện trong một hook_init
và mô-đun Bộ lọc HTML có chức năng bên trong để kiểm tra và tải mỗi khi cần thư viện.
Đây có thể là một thực tiễn phổ biến , nhưng nó dường như không phải là một thực tiễn tốt nhất .
Mô-đun của tôi có nên chủ động và tuyên bố hook_libraries_info
để tôi có thể sử dụng libraries_load('foo')
không? Điều này cũng vậy, có vẻ kỳ quặc.
if (libraries_load($name)) {..}
là để tránh WSOD trong trường hợp thư viện không có mặt.