插件钩子

钩子的机制是允许插件把一些功能“挂载”到系统中。系统运行至某个环节时,去调用插件内的一些函数。钩子分为两种:

  • 动作 Action

    动作是 ginkgo 运行到某些环节时,就会被执行的一种钩子。插件可以通过动作来指示系统在遇到这些环节的时候,执行指定的函数。

  • 过滤器 Filter

    过滤器的是 ginkgo 用于修改将要保存或发送出去的数据的一种钩子。插件可以通过过滤器来指示系统在遇到某些环节的时候,就执行指定的函数去修改特定的数据。

某些时候动作和过滤器可以达到相同的效果。比如要修改文章的内容,可以把插件挂载到过滤器 filter_console_article_edit 上,在文章的内容保存到数据库前就修改它。也可以把插件挂载到过滤器 filter_pub_article_show 上,在文章的内容发送到浏览器前修改它。

动作钩子和过滤器钩子最大的区别是过滤器有回传参数,可以利用插件将修改过的数据回传给系统,不同的钩子处理修改过的数据时也有所不同,有的是保存到数据库之前就修改,有的是在内容发送到浏览器前修改。

插件钩子命名一般遵循如下规则:{$类型}_{$位置}_{$动作}_{$状态},如:filter_console_link_add过滤器_管理后台_链接_添加)。

注意:action_fwfilter_fw 前缀为框架内核专用,不建议使用。

ginkgo 框架本身也提供了一些钩子以供使用:

名称 类型 描述
action_fw_init action 框架初始化时触发
action_fw_response_send action 响应发送时触发
action_fw_response_end action 响应输出后触发
action_fw_end action 框架运行结束时触发
filter_fw_view filter 视图渲染时过滤

filter_fw_view 返回参数为渲染后的 HTML,回传参数也必须是 HTML。


添加钩子

可以使用 ginkgo\Plugin 类的 listen 方法添加钩子,此方法一般用于系统中,而非插件中。例如:

  1. Plugin::listen('filter_console_article_edit');

可以给 listen 方法传入数据,此数据会传给插件,插件将这些数据进行处理后返回,此时,钩子便是过滤器类型,否则即为动作,例如:

  1. $data = Plugin::listen('filter_console_article_edit', $data);

返回一个多维数组,结构如下:

  1. Array
  2. (
  3. // 键名为钩子名称
  4. '命名空间\插件类名->插件方法1' => Array() //过滤后的数据
  5. '命名空间\插件类名->插件方法2' => Array()
  6. )

钩子的位置可以随意放置

钩子必须在系统开发时预埋以便提供给二次开发者使用