将 Submissions
添加到 Package 依赖项中
dependencies: [
...,
.package(url: "https://github.com/nodes-vapor/submissions.git", from: "3.0.0")
]
以及你的目标(例如 "App")
targets: [
...
.target(
name: "App",
dependencies: [
...
.product(name: "Submissions", package: "submissions")
]
),
...
]
编写 Submissions 的目的是减少编写以下常见任务所需的样板代码:渲染表单,以及处理和验证来自 POST/PUT/PATCH 请求的数据(简称 PPP 请求,或提交)。 Submissions 使 Web 用户和 API 消费者可以轻松地呈现详细的验证错误。
Submissions 的设计具有灵活性。 它的功能基于 Field
,Field
是对提交的各个部分进行建模的抽象。
带有其验证器和元数据(例如标签)的单个值。 通常,表单或 API 请求涉及包含模型的多个属性。 这可以使用多个 Field
进行建模。
首先,请确保在所有需要的地方都已导入 Submissions
import Submissions
"Submissions" 附带一个轻量级的 provider,我们需要在 configure.swift
文件中的 configure
函数中注册它
try services.register(SubmissionsProvider())
这确保了可以使用 FieldCache
服务将字段和错误存储在请求中。
TODO
Submissions 附带 leaf 标签,可以将字段渲染为 HTML。 需要将 leaf 文件从 Submissions
的 Resources/Views/Submissions
文件夹复制到你的项目的 Resources/Views
。 然后,我们可以注册 Submissions 的 leaf 标签,就像注册其他 leaf 标签一样,例如
var leafTagConfig = LeafTagConfig.default()
...
leafTagConfig.useSubmissionsLeafTags()
services.register(leafTagConfig)
你可以通过将修改后的 TagTemplatePaths
实例传递给 useSubmissionsLeafTags(paths:)
,来自定义 Submissions 查找 leaf 标签的位置。
为了渲染包含 Submissions leaf 标签的视图,我们需要确保 Field
已添加到字段缓存,并且 Request
已传递到 render
调用中
let nameField = Field(key: "name", value: "", label: "Name")
try req.fieldCache().addFields([nameField])
try req.view().render("index", on: req)
然后在你的 leaf 文件中,你可以使用适当的标签和键 "name"(在创建 Field 时定义的)来引用该字段。
以下输入标签可用于你的 leaf 文件。
#submissions:checkbox( ... )
#submissions:email( ... )
#submissions:hidden( ... )
#submissions:password( ... )
#submissions:text( ... )
#submissions:textarea( ... )
它们都接受相同数量的参数。
使用这些选项
位置 | 类型 | 描述 | 示例 | 必填? |
---|---|---|---|---|
1 | key | 字段缓存中相关字段的键 | "name" | 是 |
2 | placeholder | 占位符文本 | "输入姓名" | 否 |
3 | help text | 帮助文本 | "此名称将对其他人可见" | 否 |
要将文件上传添加到你的表单,请使用此 leaf 标签。
#submissions:file( ... )
使用这些选项
位置 | 类型 | 描述 | 示例 | 必填? |
---|---|---|---|---|
1 | key | 字段缓存中相关字段的键 | "avatar" | 是 |
2 | help text | 帮助文本 | "这将替换你现有的头像" | 否 |
3 | accept | 占位符文本 | "image/*" | 否 |
4 | multiple | 支持多文件上传 | "true"(或任何其他非 nil 值) | 否 |
可以按如下方式添加 select 标签。
#submissions:select( ... )
使用这些选项
位置 | 类型 | 描述 | 示例 | 必填? |
---|---|---|---|---|
1 | key | 字段缓存中相关字段的键 | "role" | 是 |
2 | options | 下拉列表中的可能选项 | roles | 否 |
3 | placeholder | 占位符文本 | "选择一个角色" | 否 |
4 | help text | 帮助文本 | "该角色定义了允许用户执行的操作" | 否 |
第二个选项(例如 roles
)是一个特殊参数,它定义了下拉选项。 它必须像这样传递到 render 调用中。
enum Role: String, CaseIterable, Codable {
case user, admin, superAdmin
}
extension Role: OptionRepresentable {
var optionID: String? {
return self.rawValue
}
var optionValue: String? {
return self.rawValue.uppercased()
}
}
let roles: [Role] = .
try req.view().render("index", ["roles": roles.allCases.makeOptions()] on: req)
此软件包由 Vapor 团队在 Nodes 开发和维护。
此软件包是根据 MIT 许可证 获得许可的开源软件。