Структура проекта Laravel 5 (система плагинов)

Я пытаюсь разработать свое первое приложение Laravel (5), которое можно расширить с помощью плагинов. Я много читал об архитектуре плагинов, но у меня возникли трудности с лучшим или предпочтительным способом организации такого проекта в Laravel. Я был бы очень благодарен за любую помощь и совет здесь, так как я не хочу идти по неправильному пути.

Вот как я думаю о структурировании и реализации этого:

/ Plugins
    - PluginManager.php

    / Contracts
        - PluginInterface.php

    / Plugins

        / ExamplePlugin1
            - ExamplePlugin1.php

        / ExamplePlugin2
            - ExamplePlugin2.php

Вопрос 1. Где лучше всего расположить корневой каталог /Plugins? Непосредственно в корневой папке app/ или где-то вроде app/Http?

При запуске приложения я хочу, чтобы класс PluginManager сканировал подкаталог Plugins/Plugins/, где будут находиться все установленные плагины. В этот момент PluginManager создаст экземпляр отражения этих классов плагинов и сохранит их в массиве, чтобы он мог перебрать их позже и вызвать методы для них, если они существуют.

Вопрос 2. Поскольку я хочу, чтобы PluginMananger был доступен для всех запросов, должен ли я использовать для этого поставщика услуг и фасад?

Вопрос 3. Эффективен ли этот метод или кто-нибудь может предложить альтернативное решение?

Все эти плагины будут реализовывать интерфейс PluginInterface, чтобы класс PluginManager мог вызывать, например, функцию init() для всех плагинов.

Спасибо за ваше время


person dpstudio    schedule 10.02.2015    source источник
comment
Почему ваши плагины не могут быть просто пакетами композитора и использовать систему пакетов?   -  person Laurence    schedule 10.02.2015
comment
@TheShiftExchange Спасибо за ваш ответ. Проект будет установлен на нескольких серверах конечных пользователей, и я хотел бы сделать систему плагинов максимально простой в использовании. По этой причине я хотел сделать установку плагинов такой же простой, как перетаскивание их в каталог Plugins/Plugins, чтобы класс PluginManager автоматически обнаруживал/загружал их. Есть ли способ, которым я могу сделать это легко, все еще используя пакеты композитора?   -  person dpstudio    schedule 10.02.2015
comment
я согласен с @TheShiftExchange. Пакеты — это стандартный способ расширения функциональности laravel. И пользователи должны иметь возможность их использовать, поскольку почти каждый разработчик laravel рано или поздно использует пакеты. Внедрение нового qay заставит их изучить другой способ расширения функциональности.   -  person nozzleman    schedule 10.02.2015
comment
@nozzleman Спасибо за ваш вклад. Хотя я согласен с полезностью пакетов, мы говорим здесь не о разработчиках, а о конечных пользователях, которые только потребляют приложение. Их единственная просьба - простота использования. Иногда (в большинстве случаев) конечным пользователям нужен знакомый сценарий перетаскивания. Возьмите Wordpress в качестве примера, где файл .zip или каталог плагина можно поместить в папку плагинов или загрузить через веб-форму. Просить их учиться или даже копаться в Composer или CLI в этом сценарии слишком много. Тем не менее, есть ли способ использовать пакеты Composer, но сохранить эту простоту использования?   -  person dpstudio    schedule 10.02.2015
comment
Я знаю, что October CMS имеет встроенную модульную систему и архитектуру плагинов. Все сборки на L5. Проверьте это: github.com/octobercms/october   -  person Felix Lebel    schedule 23.02.2015
comment
@dpstudio, дайте мне знать, если у вас есть решение этой проблемы   -  person Vijay Sebastian    schedule 24.11.2015
comment
@dpstudio повезло с этим?   -  person Code Lover    schedule 19.08.2016


Ответы (1)


Вопрос 1

Самый простой способ сделать это — создать каталог «app/Plugins» («app/Http/Plugins», только если ваши плагины относятся к основному приложению Laravel или маршрутизируют @RTM: "Думайте о каталогах Console и Http как о предоставлении API в "ядро" вашего приложения." ).

Вопрос 2

ДА! @see: проблема с производительностью при использовании отложенных поставщиков

Вопрос 3

Может быть, вы можете сделать что-то вроде plugins.lock в корне вашего приложения, чтобы избежать сканирования «приложений/плагинов» при каждом запросе?

person ShuifuraX    schedule 22.05.2015