DuckPhp\Core\AppPluginTrait

简介

这个Trait 把App类变成插件

选项

需要注意的是:AppPluginTrait 的选项是在 plugin_options 设置.

‘plugin_path_namespace’ => null,

  1. 插件的命名空间路径

‘plugin_namespace’ => null,

  1. 插件的命名空间

‘plugin_routehook_position’ => ‘append-outter’,

  1. 插件路由的插入方法

‘plugin_path_conifg’ => ‘config’,

  1. 插件的配置文件

‘plugin_path_view’ => ‘view’,

  1. 插件的视图文件

‘plugin_search_config’ => false,

  1. 插件搜索方法

‘plugin_files_config’ => [],

  1. 插件的配置文件列表

‘plugin_url_prefix’ => ‘’,

  1. URL 前缀,限定插件的目录。

公开方法

  1. public function pluginModeInit(array $options, object $context = null)
  2. public static function PluginModeRouteHook($path_info)
  3. public function _PluginModeRouteHook($path_info)
  4. public function pluginModeGetOldRoute()

用于重载的事件方法

  1. protected function onPluginModePrepare()
  2. protected function onPluginModeInit()
  3. protected function onPluginModeBeforeRun()
  4. protected function onPluginModeRun()

onPluginModeBeforeRun 运行阶段就执行 onPluginModeRun 得到回调之后才执行。

内部方法

  1. protected function pluginModeInitOptions($options)
  2. protected function pluginModeDefaultInit(array $options, object $context = null)
  3. protected function pluginModeIncludeConfigFile($file)
  4. protected function pluginModeSearchAllPluginFile($path, $setting_file = '')
  5. protected function pluginModeDefaultRouteHook($path_info)
  6. protected function pluginModeCloneHelpers()

主流程

详解

例子见于 template/public/full/

如何使用 一个应用级插件?

App 的 ext 选项里加个 插件名称 => 插件配置的类

如何把现有应用变成插件

App 类 use AppPluginTrait

初始化阶段

插件的初始化, 插件的初始化和 App 的初始化不同。 你要重写 pluginModeInit() 这个函数。 因为是 trait 不是父类,所以要在 再调用父类 的 同名方法的地方使用 pluginModeDefaultInit 。

插件的选项是通过 plugin_options 变量而不是 options 变量修改,目的就是子类化的时候可使用父类的选项。 ‘plugin_path_namespace’ => null, 是指定插件类的基准文件目录,以配合插件的其他类使用。 默认为空的时候,会去搜索插件类的上一级类, 如 UserSystem\Base\App => UserSystem 。 这里注意到是,是 UserSystem 而不是 UserSystem\Base

‘plugin_path_conifg’ => ‘config’, 配置文件的目录, ‘plugin_path_view’ => ‘view’, 视图文件的目录。 这两在默认模式, 会提供默认的视图和配置,如果在你的应用里有同名文件,则会被覆盖。

‘plugin_routehook_position’ => ‘append-outter’,

特殊配置文件会从这里加载 pluginModeIncludeConfigFile protected function pluginModeSearchAllPluginFile($path, $setting_file = ‘’) 搜索所有配置文件

运行阶段

默认情况下 AppPluginTrait 会有个 RouteHook 附加在最后面,执行运行部分的代码。

PluginModeRouteHook -> _PluginModeRouteHook -> pluginModeDefaultRouteHook 。

为什么 PluginModeRouteHook 是静态的,是为了Swoole 模式不用修改。

_PluginModeRouteHook 就是你可以继承修改的方法

pluginModeDefaultRouteHook 默认的路由钩子

pluginModeDefaultRouteHook 通过 pluginModeCloneHelpers 把自己的 Helper 克隆过去调整 View 目录。

然后切入自己的 namespace 执行控制器。

  1. public function pluginModeInit(array $options, object $context = null)
  2. public static function PluginModeRouteHook($path_info)
  3. public function _PluginModeRouteHook($path_info)
  4. protected function pluginModeInitOptions($options)
  5. protected function pluginModeDefaultInit(array $options, object $context = null)
  6. protected function pluginModeIncludeConfigFile($file)
  7. protected function pluginModeSearchAllPluginFile($path, $setting_file = '')
  8. protected function pluginModeDefaultRouteHook($path_info)
  9. protected function pluginModeCloneHelpers()
  10. protected function onPluginModePrepare()
  11. protected function onPluginModeInit()
  12. protected function onPluginModeBeforeRun()
  13. protected function onPluginModeRun()
  14. protected function pluginModeBeforeRun($callback)