ACF mvc.lua 参考文档

出自 Alpine Linux

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()` ...

  1. subcontroller.worker
  2. controller
  3. controller.worker
  4. APP
  5. APP.worker
  6. MVC
  7. MVC.worker


这允许,例如,应用程序设置一个默认方法,该方法对所有子控制器都可用。 模型首先查看其父 worker 表的原因是控制器方法通常在 worker 表中,而模型通常不相互继承。

调用代码应确保在此对象完成时调用 `destroy` 函数。

destroy ( self )

如果 `mvc.on_unload` 函数存在,则调用它以关闭对象打开的任何资源。

dispatch ( self, prefix, controller, action, clientdata )

在受保护的 xpcall 中执行控制器操作的网关。

  1. 如果未指定控制器,则使用默认前缀/控制器
  2. 创建一个 `self:new ( prefix .. controller)` mvc 对象
  3. 如果未指定操作,则使用控制器默认操作
  4. 运行任何现有的 `worker.mvc.pre_exec` 函数
  5. 运行 `worker.action`
  6. 运行任何现有的 `worker.mvc.post_exec` 函数
  7. 从 `view_resolver` 获取视图函数
  8. 使用 `worker.action` 的结果执行视图
  9. 并调用 `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。