1. XenForo 1.5.14 中文版——支持中文搜索!现已发布!查看详情
  2. Xenforo 爱好者讨论群:215909318 XenForo专区

新闻 form-binder 0.8.0 发布,微型数据绑定和校验框架 下载

本帖由 漂亮的石头2014-11-03 发布。版面名称:软件资讯

  1. 漂亮的石头

    漂亮的石头 版主 管理成员

    注册:
    2012-02-10
    帖子:
    485,682
    赞:
    46
    这次改动比较大,所以跳过了 0.7.0,直接到了 0.8.0.

    调整的方向是简化接口、统一体验。展开点说,就是:


    • 合并`BulkPreProcessor`/`PreProcessor`。不像原来的 BulkPreProcessor 只能用于 FormBinder,PreProcessor 只能用于 field mapping,现在的 PreProcessor (接口) 可以通用于 FormBinder 和 field/group mapping


    • 修改扩充`Constraint`。原来的 Constraint 只能用于 field mapping,现在的 Constraint (接口)可以通用于 FormBinder 和 field/group mapping


    • 不过也没有丢弃`Bulk`和`single`的区分,毕竟有些 constraint/pre-processor 只接受 one input string,有些只接受 multiple input strings,所以增加了标记性 trait `InputMode`帮助扩展开发者用来指定和限制

    当然还有很多其他的调整和改动,具体请看 Release Notes。在这我就不重写一遍了。

    总的来说,这次的调整给普通用户/开发者和扩展开发者,都带来了极大简化和便利,虽然这种简化和便利需要自己作出一些调整来适应。

    还好,尽管内部改造进行得轰轰烈烈,对外的影响还是不那么大的。[​IMG]

    以下是一些受影响的地方以及相关修改建议:

    对普通用户/开发者,

    1)`pipe_:` 重命名为`>-:`

    建议:应用代码中简单重命名即可

    2)constraint `expandJsonData` 重命名为`expandJsonString`,并对参数有调整

    建议:原来的应用代码可能是

    expandJsonData("body", Some(""))pipe_: FormBinder(messages)

    现在应改为

    expandJsonString(Some("body"), Some(""))>-: FormBinder(messages)

    对扩展开发者,

    1)原来的仅应用于 field mapping 的 constraint 是这样写的,

    def maxlength(length: Int, message: String = ""): Constraint = (label, value, messages) =>
    if (value != null && value.length > length) {
    Some( (if (message.isEmpty) messages("error.maxlength") else Some(message)).get.format(value, length))
    } else None

    现在应该这样来写了,

    def maxlength(length: Int, message: String = "") = mkSimpleConstraint((label, value, messages) =>
    if (value != null && value.length > length) {
    Some( (if (message.isEmpty) messages("error.maxlength") else Some(message)).get.format(value, length))
    } else None)

    2)原来的仅应用于 field mapping 的 pre-processor 是这样写的,

    def geometry(constraints: Constraint*): FieldMapping[Geometry] =
    new FieldMapping[Geometry](parsing(fromWKT[Geometry], "error.geometry") +: constraints,
    convert = (value: String) => value match {
    case null|"" => null
    case x => fromWKT[Geometry](x)
    })

    现在让我们这样来做,

    def geometry(constraints: (Constraint with OneInput)*): Mapping[Geometry, OneInput] =
    new FieldMapping[Geometry, OneInput](
    convert0 = mkSimpleConverter {
    case null|"" => null
    case x => fromWKT[Geometry](x)
    }).>+:((parsing(fromWKT[Geometry], "error.geometry") +: constraints): _*)

    另外,阅读源码的同学应该能发现,重构后的代码比原来更清晰、更容易扩展了。

    更多的细节,请查阅项目文档和源码。
    form-binder 0.8.0 发布,微型数据绑定和校验框架下载地址
     
正在加载...