【问题标题】:Laravel 5 Project Structure (Plugin System)Laravel 5 项目结构(插件系统)
【发布时间】: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


【解决方案1】:

问题 1

最简单的方法是创建一个目录“app/Plugins”(“app/Http/Plugins”,仅当您的插件特定于 Laravel 核心应用程序或路由 @RTM“将 Console 和 Http 目录视为为应用程序的“核心”提供 API。”)。

问题 2

是的! @见:performance issue using deferred providers

问题 3

您能否在应用程序根目录中创建一种 plugins.lock 以避免在每次请求时扫描“app/Plugins”?

【讨论】:

    猜你喜欢
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多