# 插件

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

## _Vanilla Plugin 的简单使用_

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

```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)`_），即能在对应的时机执行相关钩子对应的方法_

```lua
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 中插件钩子_

```lua
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)        -- 请求分发执行结束
```
