ACF mvc.lua 参考文档
mvc.lua 函数参考
这个 lua 模块提供了创建 mvc 应用程序的基础。它的模式大致模仿 Ruby on Rails 模式 - 但要简单得多。
通用模式是使用 mvc 的 `new` 函数创建一组表,然后在这些表中使用 `new` 创建子 “对象”。 通过使用元表 `.__index` 方法,函数引用会沿着父表向上流动。
new( self, modname )
返回 3 个值:一个 mvc 表和 2 个布尔值(如果加载了 modname-controller 和 modname-model.lua,则为 true 或 false)
mvc 表包含
表 | 用于 | 注释 | .__index 指向 |
---|---|---|---|
配置 | 配置项 | 仅当父级中不存在 `conf` 表时才创建 | 不适用 |
客户端数据 | 从客户端发送的数据 | 仅当父级中不存在 `clientdata` 表时才创建 | 不适用 |
worker | “控制器”方法 | 如果给定了 `modname`,则 `modname-controller.lua` 模块会加载到此表中。 否则,返回一个空表。 | self(父 mvc 对象) |
worker.mvc | 由 mvc `dispatch` 函数运行的特殊方法 | 如果 `modname-controller.lua` 模块未初始化 `.mvc` 表,则会创建一个空表 | self.mvc(父 mvc 对象的 mvc 表) |
model | “模型”方法 | 如果给定了 `modname`,则 `modname-model.lua` 模块会加载到此表中。 否则,返回一个空表。 | worker(此 mvc 对象的 worker 表) |
返回的表有一个 `.__index` 方法指向 `worker`,因此该表可以从父表继承值。
如果 `modname-controller.lua` 包含 `.mvc.on_load` 函数,则在 `new` 返回之前运行该函数。
`. __index` 元方法意味着此代码将设置如图所示的继承
require("mvc") MVC=mvc:new() APP=MVC:new() controller=APP:new() subcontroller=controller:new()
如果您尝试运行 `subcontroller.model.somefunction()`,并且它不存在,则继承将在以下位置查找 `somefunction()` ...
- subcontroller.worker
- controller
- controller.worker
- APP
- APP.worker
- MVC
- MVC.worker
这允许,例如,应用程序设置一个默认方法,该方法对所有子控制器都可用。 模型首先查看其父 worker 表的原因是控制器方法通常在 worker 表中,而模型通常不相互继承。
调用代码应确保在此对象完成时调用 `destroy` 函数。
destroy ( self )
如果 `mvc.on_unload` 函数存在,则调用它以关闭对象打开的任何资源。
dispatch ( self, prefix, controller, action, clientdata )
在受保护的 xpcall 中执行控制器操作的网关。
- 如果未指定控制器,则使用默认前缀/控制器
- 创建一个 `self:new ( prefix .. controller)` mvc 对象
- 如果未指定操作,则使用控制器默认操作
- 运行任何现有的 `worker.mvc.pre_exec` 函数
- 运行 `worker.action`
- 运行任何现有的 `worker.mvc.post_exec` 函数
- 从 `view_resolver` 获取视图函数
- 使用 `worker.action` 的结果执行视图
- 并调用 `destroy` 来销毁 mvc 对象
如果发生错误,则运行 `exception_handler` 函数。 如果可能,则运行新 mvc 对象的异常处理程序,否则 `self::exception_handler` 函数处理错误。 如果在创建新 mvc 对象后发生异常,则保证运行 `mvc.on_unload`,但不保证运行 `mvc.post_exec`。
soft_require ( self, modname )
在 `self.conf.appdir` 中查找 `modname.lua` 并返回 `require()` 的结果。 如果 `modname` 不存在,则返回 nil。
此函数允许加载模块,而不会在模块不存在时生成异常。
read_config ( self, modname )
在各个位置查找 `modname.conf` 文件并将其内容解析到 `self.conf` 表中。
parse_path_info ( string )
返回 3 个字符串:前缀、控制器和操作。 给定 URI 或路径规范格式的字符串,返回 `basename` 作为操作,`dirname` 的最后一个组件作为控制器,其余作为前缀。 缺失的组件将作为空字符串返回。
find_view ( appdir, prefix, controller, action, viewtype )
返回一个字符串,其中包含此 前缀/控制器/操作/视图类型 组合的视图文件名;如果不存在视图文件,则返回 nil。
create_helper_library ( self )
返回一个函数指针表,该表将传递给每个视图。
auto_view (viewtable, viewlibrary, pageinfo, session)
此函数用作最后的视图手段。 如果找不到视图文件,则调用此函数以显示由调用的操作产生的 CFE。 支持以下“视图类型”
- html
- json
- stream
- serialized
view_resolver ( self )
返回一个函数指针以显示视图、一个可供视图函数使用的函数表、一个包含视图感兴趣的值的表以及一个包含会话数据的表。 最后三个返回值旨在成为视图函数指针的最后三个参数。
soft_traceback ( self, message )
如果调用时没有参数,则返回 `debug.traceback`,否则返回 “message”。
exception_handler ( self, message )
打印错误消息,然后重新断言异常。 如果 `dispatch` 中的 xpcall 发生错误,则调用此函数。 这是最后的 `exception_handler`。 应用程序应提供更健壮的异常处理程序。
cfe ( table )
返回一个包含 `value`、`type` 和 `label` 值的表。 如果在调用中给出了输入表,则也会添加这些键/值对。 保证视图不会在 value、type 或 label 上获得 “nil”。 此函数已添加到全局 (_G) 环境中,因此整个应用程序都可以使用它。
logevent ( message )
将消息记录到 syslog。
handle_clientdata ( form, clientdata )
这是一个辅助函数,供控制器实现表单。 它解析表单 CFE 并应用用户在 `clientdata` 中提交的任何更改。
handle_form ( self, getFunction, setFunction, clientdata, option, label, descr )
这是一个辅助函数,供控制器实现表单。 它调用 `getFunction` 来获取表单 CFE。 如果提交了表单,它将调用 `handle_clientdata` 和 `setFunction` 来提交表单。 返回表单 CFE。