2015-02-10 18 views
9

Tôi đang cố gắng phát triển ứng dụng Laravel (5) đầu tiên có thể được mở rộng bằng các plugin. Tôi đã đọc rất nhiều về kiến ​​trúc plugin, nhưng những gì tôi đang gặp phải là tốt nhất hoặc cách ưa thích để tổ chức một dự án như vậy trong Laravel. Tôi rất biết ơn vì sự giúp đỡ và lời khuyên ở đây vì tôi không muốn đặt ra con đường không chính xác.Cấu trúc dự án Laravel 5 (Hệ thống Plugin)

Đây là cách tôi đang nghĩ về cách xây dựng và thực hiện điều này:

/ Plugins 
    - PluginManager.php 

    /Contracts 
     - PluginInterface.php 

    /Plugins 

     /ExamplePlugin1 
      - ExamplePlugin1.php 

     /ExamplePlugin2 
      - ExamplePlugin2.php 

Câu hỏi 1:đâu sẽ là nơi tốt nhất cho thư mục gốc/Plugins để được đặt ở đâu? Trực tiếp trong thư mục app/root hoặc một nơi nào đó như app/Http?

Khi khởi động ứng dụng, tôi muốn lớp PluginManager quét thư mục Plugins/Plugins/sub vì đó là nơi tất cả các plugin được cài đặt sẽ nằm. Tại thời điểm đó, PluginManager sẽ tạo ra một thể hiện phản chiếu của các lớp plugin đó và lưu chúng trong một mảng để nó có thể lặp qua chúng và gọi các phương thức trên chúng nếu chúng tồn tại.

Câu hỏi 2: Vì tôi muốn PluginMananger khả dụng cho mọi yêu cầu, tôi có nên sử dụng Nhà cung cấp dịch vụ và Mặt tiền cho điều này không?

Câu hỏi 3: Phương pháp này có hiệu quả hoặc bất kỳ ai có thể cung cấp giải pháp thay thế không?

Tất cả các plugin đó sẽ triển khai giao diện PluginInterface để lớp PluginManager có thể gọi, ví dụ như hàm init() trên tất cả các plugin.

Cảm ơn thời gian của bạn

+0

Tại sao các plugin của bạn không thể là các gói soạn nhạc - và sử dụng hệ thống gói? – Laurence

+0

@TheShiftExchange Cảm ơn bạn đã trả lời. Dự án sẽ được cài đặt trên một số máy chủ của người dùng cuối và tôi muốn làm cho hệ thống plugin dễ sử dụng nhất có thể. Vì lý do này, tôi muốn cài đặt các plugin dễ dàng như kéo và thả chúng vào thư mục _Plugins/Plugins_ và có lớp PluginManager tự động phát hiện/tải chúng.Có cách nào tôi có thể làm cho nó dễ dàng trong khi vẫn sử dụng các gói soạn nhạc? – dpstudio

+0

tôi đồng ý với @TheShiftExchange. Các gói là cách tiêu chuẩn để mở rộng chức năng của laravel. Và người dùng nên có khả năng sử dụng chúng vì hầu như mọi devder dev sử dụng các gói sớm hay muộn. Giới thiệu một qay mới sẽ buộc họ phải "tìm hiểu" một cách khác để mở rộng funktionality .. – nozzleman

Trả lời

1

Câu hỏi 1

Cách đơn giản nhất để làm điều này, là để tạo ra một thư mục "app/Plugins" ("app/Http/Plugins" chỉ khi bạn các trình cắm thêm dành riêng cho ứng dụng lõi Laravel hoặc định tuyến @RTM: "Hãy nghĩ đến các thư mục Console và Http khi cung cấp một API vào" lõi "của ứng dụng của bạn.").

Câu hỏi 2

YES! @see: performance issue using deferred providers

Câu hỏi 3

Có thể là bạn có thể làm một loại plugins.lock trong thư mục gốc ứng dụng của bạn để tránh quét "app/Plugins" trên tất cả các yêu cầu?

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