插件钩子
钩子的机制是允许插件把一些功能“挂载”到系统中。系统运行至某个环节时,去调用插件内的一些函数。钩子分为两种:
动作 Action
动作是 ginkgo 运行到某些环节时,就会被执行的一种钩子。插件可以通过动作来指示系统在遇到这些环节的时候,执行指定的函数。
过滤器 Filter
过滤器的是 ginkgo 用于修改将要保存或发送出去的数据的一种钩子。插件可以通过过滤器来指示系统在遇到某些环节的时候,就执行指定的函数去修改特定的数据。
某些时候动作和过滤器可以达到相同的效果。比如要修改文章的内容,可以把插件挂载到过滤器 filter_console_article_edit
上,在文章的内容保存到数据库前就修改它。也可以把插件挂载到过滤器 filter_pub_article_show
上,在文章的内容发送到浏览器前修改它。
动作钩子和过滤器钩子最大的区别是过滤器有回传参数,可以利用插件将修改过的数据回传给系统,不同的钩子处理修改过的数据时也有所不同,有的是保存到数据库之前就修改,有的是在内容发送到浏览器前修改。
插件钩子命名一般遵循如下规则:{$类型}_{$位置}_{$动作}_{$状态}
,如:filter_console_link_add
(过滤器_管理后台_链接_添加
)。
注意:
action_fw
和filter_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
方法添加钩子,此方法一般用于系统中,而非插件中。例如:
Plugin::listen('filter_console_article_edit');
可以给 listen
方法传入数据,此数据会传给插件,插件将这些数据进行处理后返回,此时,钩子便是过滤器类型,否则即为动作,例如:
$data = Plugin::listen('filter_console_article_edit', $data);
返回一个多维数组,结构如下:
array(
// 键名为钩子名称
'命名空间\插件类名->插件方法1' => array(), //过滤后的数据
'命名空间\插件类名->插件方法2' => array(),
);
钩子的位置可以随意放置
钩子必须在系统开发时预埋以便提供给二次开发者使用