Cách tự động tải các lớp từ thư viện PHP của bên thứ 3


7

Tôi muốn sử dụng thư viện PHP của bên thứ 3 trong mô-đun của mình và tôi muốn hỏi tôi cần làm gì để tự động tải các lớp?

Ví dụ: Drupal \ my_module \ MyClass muốn khởi tạo ThirdPartyNamespace \ Something \ Else \ Class1

Tài liệu chính thức của Drupal 8 không thực sự xử lý các tình huống đặt tên phức tạp hơn.



Câu hỏi khác là một năm tuổi, rất nhiều điều có thể thay đổi trong một năm ở Drupal 8, vì vậy không biết phải trả lời ở đâu. Trình quản lý nhà soạn nhạc là một cách, bạn cũng có thể tránh được sự phụ thuộc được mã hóa cứng bằng cách giao hàng với trình tải tự động của riêng bạn như github.com/amateescu/search_api_solr . Hoặc thậm chí bạn có thể đi đến nhà soạn nhạc đầy đủ và xây dựng Drupal và các mô-đun với nhà soạn nhạc, giống như làm cho drush. Tôi không thể tìm thấy một nguồn tài nguyên tốt ngay bây giờ, nhưng mọi người đang làm việc để biến điều đó thành hiện thực. Ưu điểm là nó tự động lấy các tệp composer.json và kết hợp mọi thứ.
Berdir

@Berdir hoặc @Clive bạn có thể cho tôi biết chúng ta đang ở đâu với điều này trong 8.1. Nó nói ở đây rằng nó phải hỗ trợ nó trong các mô-đun tùy chỉnh của tôi nhưng tôi không thể tìm ra cách để làm cho nó hoạt động. Tôi đặt requirecâu lệnh trong tệp composer.json vào thư mục mô-đun của mình, composer installnhưng Drupal vẫn nói rằng anh ta không thể tìm thấy lib của tôi.
Guillaume Bois

Bạn cũng cần cài đặt mô-đun của mình với trình soạn thảo để nó biết về các phụ thuộc của bạn. Xem drupal.org/node/2404989 . Nếu nó là một mô-đun tùy chỉnh, bạn cần tự thêm chúng vào composer.json chính.
Berdir

@berdir nếu tôi không nhầm, nhà soạn nhạc không cài đặt một mô-đun trong drupal, nó chỉ đơn giản là tải các lib. Tôi không thể thấy lý do tại sao tôi cần thêm libs cần thiết của mình trong composer.json VÀ cái từ gốc. Và nếu tôi cần đặt nó trong root composer.json thì tôi đang sửa đổi git của Drupal và tôi cần quản lý một nhánh khác của gup Drupal chỉ cho tệp đó. Drupal có thể bao gồm tất cả các lib từ tất cả composer.json, không chỉ một từ gốc.
Guillaume Bois

Câu trả lời:


4

Drupal sử dụng nhà soạn nhạc để quản lý các thư viện của bên thứ 3 (Symfony, guuff, v.v ...). Vấn đề là Drupal đã phiên bản thư mục nhà cung cấp vào thư mục lõi; đó là một vấn đề bởi vì, nếu bạn đã thêm một thư viện mới trong trình soạn thảo gốc, bạn thay đổi thư mục nhà cung cấp và thay đổi composer.json / composer.lock. Vì vậy, nếu Drupal phát hành phiên bản mới, những thay đổi của bạn sẽ bị xóa.

Các Composer Quản lý mô-đun được tạo ra để giải quyết vấn đề. Bạn cần bao gồm tệp composer.json trong mô-đun của mình; mô-đun Trình quản lý Trình tải xuống thư viện và đăng ký tệp tự động tải mới (tự động tải thứ hai).
Vấn đề với điều này chỉ là khi bạn cần sử dụng thư viện trung gian, vì mô-đun Trình quản lý trình soạn thảo đăng ký tự động tải mới trong Sự kiện hạt nhân yêu cầu. Sự kiện này được gọi sau kho trung gian nên thư viện này không có sẵn trong lớp trung gian.

Trong hầu hết các trường hợp, mô-đun Trình quản lý Trình soạn thảo là giải pháp tốt nhất để thêm nhà cung cấp mới.

Có vấn đề Loại bỏ các phụ thuộc bên ngoài khỏi repo cốt lõi và để Composer quản lý các phụ thuộc thay thế .


Xin lưu ý rằng trình quản lý soạn nhạc drupal 8.1 không còn cần thiết nữa. Cách được đề xuất là sửa đổi composer.json vận chuyển với drupal trong root drupal. Thanh toán github.com/drupal-composer/drupal-scaffold .
pwaterz

Không nên bắt đầu soạn trong thư mục mô-đun. Tốt hơn là thay đổi tệp soạn thảo gốc để bao gồm phụ thuộc. Và vì gần đây thậm chí có thể yêu cầu các mô-đun Drupal trong tệp soạn thảo gốc, nó cũng sẽ cài đặt tất cả các phụ thuộc của các mô-đun này.
Neograph734

2

Tôi đã chỉnh sửa composer.json trong thư mục gốc của dự án Drupal của tôi và trong mô-đun dựa trên thư viện. Sau đó, tôi đã tải lớp chính bằng một đường dẫn cố định:

require_once (\Drupal::root() . '/vendor/campaignmonitor/createsend-php/csrest_general.php');

Sau đó, tôi nhận thấy có một vấn đề với việc khởi tạo một đối tượng của lớp:

$wrap = new CS_REST_General($auth);

Vì vậy, rõ ràng bạn cần thêm một '\', vd:

$wrap = new \CS_REST_General($auth);

1
Tôi nghĩ bạn chỉ cần làm điều này vì campaignmonitor/createsend-phpkhông tuân thủ các tiêu chuẩn PSR-0 hoặc PSR-4 vì nó quá cũ nên nó được viết trước khi các tiêu chuẩn đó được thông qua, và do đó bạn không thể sử dụng trình tải tự động. Câu trả lời này khá cụ thể đối với thư viện này, nhưng bạn nên giải thích trong câu trả lời của mình nhiều hơn về lý do tại sao bạn cần thêm `` (vì không gian tên) và tại sao có thể cần thiết cho các thư viện cũ này.
mradcliffe

0

Có vẻ như các câu trả lời hiện tại đều lỗi thời. Khi bạn sử dụng Trình soạn thảo để quản lý các phụ thuộc của dự án, tốt nhất là drupal-composer/drupal-project, tất cả những gì bạn cần làm là yêu cầu một gói trong gốc dự án của bạn composer.jsonvà sau đó tải các lớp của nó bất cứ nơi nào bạn cần.

$ cd MYPROJECT
$ composer require ramsey/uuid

Sau đó, trong mô-đun tùy chỉnh của bạn chỉ usecó nó.

use Ramsey\Uuid\Uuid;

Để cho mô-đun tùy chỉnh của bạn tự cung cấp, composer.jsonbạn có thể thêm wikimedia/composer-merge-pluginvào gốc dự án của mình composer.jsonvà trong "extra": {}phần cấu hình nó để bao gồm các mô-đun khác composer.jsonnằm ở một mẫu thư mục nhất định.

"merge-plugin": {
    "include": [
        "web/modules/custom/*/composer.json"
    ]
},

Mọi thứ khác được chăm sóc bởi Drupal.

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.