2013-08-05 22 views
10

Tôi đang gặp phải một dự đoán hoàn toàn nhưng cực kỳ khó chịu và khó khăn để giải quyết vấn đề.Colloser Namespace Collisions trong Phát triển Plugin WordPress

Tôi đã làm việc trên một khuôn khổ PHP để phát triển các plugin WordPress. Nó đang sử dụng Composer để quản lý sự phụ thuộc. Tất nhiên, vấn đề là nếu bạn có hai trường hợp khung của tôi trong cùng một cài đặt của WordPress, bạn có hai thư mục của nhà cung cấp và hai bản sao của bất kỳ gói nào do khung công tác yêu cầu. Điều này dẫn đến lỗi.

Chức năng khung làm plugin riêng biệt, sau đó được kế thừa bởi bất kỳ ứng dụng/plugin nào được xây dựng trên đó.

Di chuyển thư mục nhà cung cấp sang thư mục khung cốt lõi?

Sự cố: Tôi không biết điều gì sẽ xảy ra nếu tôi có hai tệp composer.json và hai tệp composer.phar ghi vào cùng thư mục nhà cung cấp và sử dụng cùng một bộ nạp tự động. Có lẽ nó sẽ không tốt. Bên cạnh đó, nó không giải quyết được vấn đề xung đột với các gói trình soạn thảo có thể được sử dụng bởi bất kỳ tập lệnh hoặc plugin nào khác ngoài những gì tôi đang cố xử lý.

Vì vậy, tôi bị kẹt. Đây có phải là một vấn đề có thể được giải quyết, hoặc là nó chỉ vốn có trong PHP?

+0

Tại sao bạn nên _need_ hai nhà cung cấp ở nơi đầu tiên? Chỉ cần chỉnh sửa tệp 'composer.json' của thư mục' vendor' chính, thêm các phụ thuộc bạn cần ở đó, từng cái một. Xóa tệp composer.lock và chạy lại 'php composer.phar install'. Trình tải tự động sẽ được cập nhật và tất cả các phụ thuộc sẽ được thêm vào thư mục nhà cung cấp chính. Trong trường hợp xảy ra xung đột tên, hãy sử dụng tiền tố hoặc chỉnh sửa các tệp thủ công, nếu cần. Bạn sẽ chỉ phải sao chép các phụ thuộc này mà không có sẵn repo (nghĩa là phụ thuộc của bạn) –

+1

@jdp: Tại sao không sử dụng trình cài đặt wordpress-plugin cho nhà soạn nhạc? Sau đó, bạn không chỉ có một thư mục nhà cung cấp trung tâm, bạn cũng quản lý để cài đặt các plugin với nhà soạn nhạc. Nếu bạn chỉ sử dụng nhà soạn nhạc làm cơ sở hạ tầng phụ, điều này không hoạt động tốt. Vì vậy, hãy tìm trình cài đặt tùy chỉnh ít nhất: https://github.com/composer/installers - http://hakre.wordpress.com/2013/08/03/your-guide-to-composer-in-wordpress/ - - http://composer.rarst.net/ --- và nếu bạn tham gia vào trong stackexchange wordpress * vòng lặp * chat, bạn có thể gặp Rarst như thế nào biết rất nhiều về chủ đề. – hakre

Trả lời

0

Tôi không phải là rất quen với Composer hoặc khuôn khổ plugin bạn đang sử dụng, nhưng nói chung - tránh hàm/lớp xung đột tên trong plugin WordPress được thực hiện theo cách sau đây:

  • Giả sử bạn plugin (ví dụ MyCoolPlugin) được viết theo hướng đối tượng, ví dụ như một lớp có tên MyCoolPlugin, bạn có thể bao gồm lớp/thư viện trợ giúp làm lớp con của MyCoolPlugin.

  • class_exists(), đây là cách tìm PHP nếu một lớp đã được xác định. Giả sử lớp helper của bạn như sau:

class MyHelperClass{ }

Bạn có thể sử dụng việc kiểm tra sau đây trước khi tuyên bố lớp trong mỗi plugin của bạn:

if(!class_exists('MyHelperClass')){ 
    class MyHelperClass{ 
    } 
} 

Tất nhiên, có một thương mại- ở đây, vì chỉ có trường hợp đầu tiên của lớp sẽ được sử dụng thông qua WordPress. Ví dụ. nếu bạn có hai plugin với hai phiên bản khác nhau của lớp trình trợ giúp - chỉ một trong số chúng sẽ hoạt động và có sẵn tại bất kỳ thời điểm nào.

  • Biến toàn cục - ví dụ: define('MY_HELPER_IS_LOADED', true); trong tệp trợ giúp (trong trường hợp bạn bao gồm chúng qua include() hoặc require()). Sau đó, vào đầu mỗi lần kiểm tra tệp trợ giúp có if(defined('MY_HELPER_IS_LOADED')) return;, điều này sẽ khiến tệp hiện được yêu cầu bao gồm/yêu cầu KHÔNG được bao gồm.

Một lần nữa các chiến thuật ở trên được sử dụng trong PHP nói chung, tôi không chắc chắn cách khung plugin của bạn được thiết lập chính xác.

6

Nhà soạn nhạc không thực sự được sử dụng nhiều lần trong cùng một dự án. Mặt khác, không có gì sai trái với nó, tuy nhiên bạn mất các tính năng phụ thuộc của nó và cần phải xử lý trường hợp này giống như các phụ thuộc chung trong môi trường WordPress.

Nói cách khác - nếu bạn không làm phụ thuộc Cách soạn nhạc và WordPress không làm phụ thuộc chút nào, nó sẽ trở thành vấn đề cá nhân của bạn cách xử lý nó.

Tôi không biết điều gì sẽ xảy ra nếu tôi có hai tập tin composer.json và hai tập tin composer.phar ghi vào thư mục cùng một nhà cung cấp và sử dụng autoloader cùng

Tôi không tuân theo lý do tại sao thư mục nhà cung cấp sẽ giống nhau nếu bạn đang sử dụng nhiều cài đặt trình soạn nhạc ... Bạn có thể giải thích cách bạn cấu trúc thư mục đó và nó có nghĩa là sử dụng công cộng hay riêng tư không?

+0

Vâng. Điều tôi đang xây dựng được mở rộng bởi các plugin khác. Các plugin con đó có thể triển khai Composer trong các dự án của chúng. Vì vậy, nếu hai plugin con được bao gồm, nói, Twig, nó sẽ phá vỡ. Tôi đã tự hỏi lớn nếu nó sẽ làm việc nếu cả hai plugin sử dụng cùng một thư mục nhà cung cấp và loại hội tụ danh sách các phụ thuộc của họ. – jdp

+0

Sử dụng cùng một thư mục nhà cung cấp sẽ không phù hợp, các trình nạp tự động quét những thứ sai, v.v. Với các trình nạp tự động cài đặt Composer bình thường, có thể ngăn xếp và sớm nhất sẽ "giành" và phục vụ các lớp va chạm, tuy nhiên mọi chức năng không có tên sẽ gây tử vong lỗi như thường lệ vì chúng không tự động tải cho chúng. Như trên - lựa chọn duy nhất của bạn là thực hiện kiểm tra của riêng bạn và logic chống lỗi của bạn. – Rarst

Các vấn đề liên quan