【发布时间】:2015-02-10 12:37:23
【问题描述】:
我正在尝试开发我的第一个可以通过插件扩展的 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 可用于所有请求,我是否应该为此使用服务提供者和 Facade?p>
问题 3:这种方法是否有效或任何人都可以提供替代解决方案?
所有这些插件都将实现 PluginInterface 接口,以便 PluginManager 类可以在所有插件上调用例如 init() 函数。
感谢您的宝贵时间
【问题讨论】:
-
为什么你的插件不能只是作曲家包 - 并使用包系统?
-
@TheShiftExchange 感谢您的回复。该项目将安装在许多最终用户的服务器上,我想让插件系统尽可能易于使用。出于这个原因,我想让插件的安装变得像将它们拖放到 Plugins/Plugins 目录中一样简单,并让 PluginManager 类自动检测/加载它们。有没有办法让我在仍然使用作曲家包的同时让它变得如此简单?
-
我同意@TheShiftExchange。包是扩展 laravel 功能的标准方式。并且用户应该能够使用它们,因为几乎每个 laravel 开发人员迟早都会使用包。引入新的 qay 将迫使他们“学习”另一种扩展功能的方式..
-
@nozzleman 感谢您的意见。虽然我同意软件包的有用性,但我们在这里讨论的不是开发人员,而是只使用应用程序的最终用户。他们唯一的要求是易于使用。有时(大多数时候)最终用户想要熟悉的拖放场景。以 Wordpress 为例,可以将插件 .zip 文件或目录拖放到插件文件夹中,或通过 Web 表单上传。在这种情况下,要求他们学习甚至在 Composer 或 CLI 中闲逛是太过分了。也就是说,有没有一种方法可以利用 Composer 包但又保持这种易用性?
-
我知道 october CMS 有一个内置的模块化系统和一个插件架构。全部建立在 L5 之上。看看:github.com/octobercms/october
标签: php laravel plugins directory-structure laravel-5