提交 📩

Swift Version Vapor Version tests codebeat Readme Score GitHub license

安装

Package.swift

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 的设计具有灵活性。 它的功能基于 FieldField 是对提交的各个部分进行建模的抽象。

带有其验证器和元数据(例如标签)的单个值。 通常,表单或 API 请求涉及包含模型的多个属性。 这可以使用多个 Field 进行建模。

开始使用 🚀

首先,请确保在所有需要的地方都已导入 Submissions

import Submissions

添加 Provider

"Submissions" 附带一个轻量级的 provider,我们需要在 configure.swift 文件中的 configure 函数中注册它

try services.register(SubmissionsProvider())

这确保了可以使用 FieldCache 服务将字段和错误存储在请求中。

验证 API 请求

TODO

验证 HTML 表单请求

Submissions 附带 leaf 标签,可以将字段渲染为 HTML。 需要将 leaf 文件从 SubmissionsResources/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 标签

可以按如下方式添加 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 许可证 获得许可的开源软件。