插件

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

Vanilla Plugin 的简单使用

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

local AdminPlugin = LoadV('vanilla.v.plugin'):new()

function AdminPlugin:routerStartup(request, response)
    print_r('<pre>')
    if request.method == 'GET' then
        print_r('-----------' .. sprint_r(request.headers) .. '----------')
    else
        print_r(request.headers)
    end
end

return AdminPlugin

Vanilla Plugin 的调用

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

local Bootstrap = Class('application.bootstrap')

function Bootstrap:initPlugin()
    local admin_plugin = LoadPlugin('plugins.admin'):new()
    self.dispatcher:registerPlugin(admin_plugin);
end

function Bootstrap:boot_list()
    return {
        Bootstrap.initPlugin,
    }
end

function Bootstrap:__construct(dispatcher)
    self.dispatcher = dispatcher
end

return Bootstrap

Vanilla 支持的插件钩子

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

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

Last updated