作为广泛测试案例的一部分,我正在构建一个基于ajax的类似CMS的应用程序,它在各种文档类型上提供CRUD功能,例如:文章,标签等。
在服务器和客户端我正在考虑使用JSON模式(http://json-schema.org/)作为以干燥方式进行用户输入验证的方式(即:1验证模式,同时使用在服务器和客户端,没有重复代码和所有这些)。这看起来很棒,因为:
JSON-schema都是用JS和Java实现的,因此一个模式理论上可以处理客户端和服务器端验证
所有CUD操作请求和响应都是JSON(通过ajax)
然而,除了用户输入的常规验证之外,我还希望在服务器上进行一些额外的检查(例如:检查用户想要创建的Tag的名称是否已存在)
理想情况下,我希望这些类型的检查包含在我的常规服务器端验证代码中(如上所述,它将基于JSON模式)。但是,我并不完全相信这是正确的方法,因为这些额外的检查不仅仅基于提供的JSON数据,而是需要额外的数据来验证(例如:系统中现有标签的名称,以检查是否标签名已经存在)。
那么,在服务器端基于json-schema的验证框架中加入如上所述的附加检查是否是一个好主意(设计/架构明智)?这会是一个优雅的解决方案吗?或者你会完全分开吗?如果没有,为什么不这样做,你会建议在客户端和服务器端验证方面保持DRY吗?
你怎么看?以下文字案例的一些其他背景/目标,以获取一些背景信息。
谢谢, 吉尔特-扬
一些背景/目标:
使用REST方法的基于ajax的CMS
使用rest方法(即分别在POST,PUT,DELETE上映射)通过ajax执行CUD请求。请求和响应都是通过JSON完成的。
没有表格的CMS。而是使用就地编辑(例如使用Aloha-editor:http://www.aloha-editor.org/
保持干爽。
模板:通过客户端和服务器端的Mustache模板完成。通过ajax进行初始渲染和增量渲染是基于1和相同的模板完成的。我想寻找与Mustache不同的东西(bc。它缺乏表现力),但它至少适用于这个原型。 (请参阅上一个替代方案的问题,我仍在寻找答案:Client-side templating language with java compiler as well (DRY templating) )
DRY输入验证:如上所述
验证流程(如果失败):
用户创建/更新/删除项目。
客户端上的验证失败会立即向用户反馈修复内容。 (Javascript JSON-schema-validator理想情况下会返回格式化为用户的JSON)
当客户端验证成功时,使用ajax执行CUD操作。
如果服务器端验证失败,则返回状态码400(错误请求),其中包含由jquery的错误回调
$.ajax({
....
error: function(xhr, status, error) {
var validationJSON = JSON.parse(xhr.responseText);
//handle server-side validation failure
},
....
});
向用户呈现包含服务器端验证失败的JSON对象(类似于客户端)
答案 0 :(得分:2)
在服务器上的一个地方(每个模型)中有一个单一的验证定义,然后可以为客户端和基于AJAX的验证生成适当的JS,这是非常可能的并且是最令人满意的事情之一。
PHP的Yii框架有一个奇妙的架构,可以以优雅的方式实现这一点,将所有验证规则存储在模型中(根据需要分成适当的“场景”)。从那里开始,只需翻转一些开关即可使特定形式的客户端或AJAX可验证。我相信Yii的接口基于Rails。
无论如何,我强烈建议您查看Yii设计中的以下要点;即使你不懂PHP,你也可以用它来获取灵感:
CModel::rules()
=>模型验证规则的DRY源CActiveForm
=>用于根据模型属性生成表单元素
CValidator
=>验证者的基类,其中包含the ability to client-validate 我认为继续进行DRY验证规则声明是明智的,根据我的经验,实现100%并且仍然具有丰富的表单和丰富的验证规则并不是不现实的。 (当你不必管理所有客户端验证JS时,男孩你会喜欢生活......)
希望这有帮助。