当前位置

网站首页> 程序设计 > 程序资讯 > 软件更新资讯 > 浏览文章

form-binder v0.3.0 发布,微型数据绑定和校验框架

作者:小梦 来源: 网络 时间: 2024-05-18 阅读:

Git@OSC 手机客户端摇一摇,有惊喜有妹纸

这是 form-binder 的第一版,不过已经相当完善,一般情况应该够用了。

测试覆盖率相当高,加上代码并不复杂,质量应该是有保障的。

有问题或建议请发 issue,我一般都会及时处理的。

=================================

form-binder 是一个容易使用和定制的微型数据绑定和校验框架。

它有如下特点:

  • 非常轻量,总共才 700 来行代码(框架 + 内置扩展)

  • 容易使用,使用过程没有冗余代码,所见及所得

  • 高度可定制,你可以扩展几乎每一个执行点

  • 容易扩展,每个扩展接口都只是一个 FunctionN 的别名

  • 不可变性,让你可以安全的共享/(嵌套)复用 mapping定义对象


form-binder 一开始是为我一个基于 Scalatra 的项目准备的,用起来会比 Scalatra 内置的 Command 框架方便不少。但是你可以把它用在其他地方,因为它不依赖 Scalatra 的代码(甚至都没有对 Scalatra 的集成做内置支持),非常容易和其他框架集成。

它单纯使用的示例代码是这样的:

import com.github.tminglei.bind.simple._case class Order(name: String, email: String, price: Float, count: Int)val binder = expandJsonData("json") pipe_: FormBinder(messages).withErr(errsToJson4s)val mappings = tmapping(  "id" -> long(),  "json" -> mapping(    "name"  -> text(maxlength(100)),    "email" -> text(email()),    "price" -> (cleanPrefix("$") pipe_: float()),    "count" -> number().verifying(min(3))  )(Order.apply).label("order")).verifying { case ((id, order), messages) =>    //do some extra verifying    Nil  }///val data = Map(  "id" -> "133",  "json" -> """{"name":"xxxx", "email":"123@example.com", "price":"$137.5", "count":5}""")binder.bind(mappings, data) { case (id, order) =>  //do something ...}

和 Scalatra 的集成,我是这样做的:

// firstly, create your FormBindSupport.scalaimport com.github.tminglei.bind.simple._object MyFormBindSupport {  val BindMessagesKey = "bind-messages"}trait MyFormBindSupport extends I18nSupport { this: ScalatraBase =>  import MyFormBindSupport._  before() {    request(BindMessagesKey) = Messages(locale, bundlePath = "i18n/bind-messages")  }  def binder(implicit request: HttpServletRequest) =    expandJsonData("json") pipe_: FormBinder(bindMessages.apply).withErr(errsToJson4s)  ///  private def bindMessages(implicit request: HttpServletRequest): Messages = if (request == null) {    throw new ScalatraException("There needs to be a request in scope to call bindMessages")  } else {    request.get(BindMessagesKey).map(_.asInstanceOf[Messages]).orNull  }}// then use it in your xxxxxxxxServlet.scalaimport com.github.tminglei.bind.simple._class FeatureServlet extends ScalatraServlet with MyFormBindSupport {  get("/:id") {    val mappings = tmapping(      "id" -> long()    )    binder.bind(mappings, params) { case (id) =>      repos.features.get(id)    }  }}

更多细节请浏览项目主页。