Vanilla 的插件体系

为了减少运行占用的系统资源,使开发更简便,Vanilla 默认只运行在 content_by_lua 这个 phrase,但是为了支持业务开发有层次化的请求控制,Vanilla 实现了便捷的插件机制,提供了六个钩子,给请求的细粒度控制提供了可能。下面我们来看看如何使用

Vanilla Plugin 的简单使用

在 Vanilla 项目中使用插件是非常简单的,只需要在 application/plugins/ 路径下实现 Vanilla 的插件 LUA 包即可,插件包可以按需实现 6 个钩子的方法。默认生成的 demo 项目中自动生成了一个 admin plugin,见 application/plugins/admin.lua。六个钩子方法按需实现,空方法可去掉,如下所示:

  1. local AdminPlugin = LoadV('vanilla.v.plugin'):new()
  2. function AdminPlugin:routerStartup(request, response)
  3. print_r('<pre>')
  4. if request.method == 'GET' then
  5. print_r('-----------' .. sprint_r(request.headers) .. '----------')
  6. else
  7. print_r(request.headers)
  8. end
  9. end
  10. return AdminPlugin

Vanilla Plugin 的调用

Vanilla Plugins 的调用非常简单,只需要在 application/bootstrap.lua 中实现 initPlugin 方法,并调用 dispatcher 的插件注册方法将插件注入项目( self.dispatcher:registerPlugin(admin_plugin)),即能在对应的时机执行相关钩子对应的方法

  1. local Bootstrap = Class('application.bootstrap')
  2. function Bootstrap:initPlugin()
  3. local admin_plugin = LoadPlugin('plugins.admin'):new()
  4. self.dispatcher:registerPlugin(admin_plugin);
  5. end
  6. function Bootstrap:boot_list()
  7. return {
  8. Bootstrap.initPlugin,
  9. }
  10. end
  11. function Bootstrap:__construct(dispatcher)
  12. self.dispatcher = dispatcher
  13. end
  14. return Bootstrap

Vanilla 支持的插件钩子

以下列出 Vanilla 支持的 6 中插件钩子

  1. function Plugin:routerStartup(request, response) -- 开始路由
  2. function Plugin:routerShutdown(request, response) -- 路由结束
  3. function Plugin:dispatchLoopStartup(request, response) -- 开始请求分发
  4. function Plugin:preDispatch(request, response) -- 预分发(载入相关的 controller
  5. function Plugin:postDispatch(request, response) -- 请求响应
  6. function Plugin:dispatchLoopShutdown(request, response) -- 请求分发执行结束