应该有可能暴露Symfony2验证规则(对于给定的实体)?我找不到像这样的东西。我正在尝试使用DRY方法进行客户端验证(使用backbone.js)。像捆绑或任何提示的东西会有所帮助。与backbone.js或javascript共享Symfony2验证规则?
Here is组件验证程序。一种可能性是:
定义服务器端验证规则使用Symfony2标准方式。示例(YAML,从他们的网站获得):
# src/Acme/BlogBundle/Resources/config/validation.yml
Acme\BlogBundle\Entity\Author:
properties:
name:
- NotBlank: ~
制作/author/rules
返回JSON对象从实体域映射到一个“编译”正则表达式。我不太确定这一点,但我认为内部Symfony2将validation.yml
规则编译成正则表达式。
假设与NotBlank
(注意我不是在正则表达式的高手,这是一个副本,并从另一个问题粘贴)制成name
领域的作者单位:
{ 'name' : '^\s*\S' }
最后检索JSON对象,做客户端验证backbone.js系统。 可能做缓存。例如(警告内部validate()
伪代码类似的代码!):
<script>
$(function() {
window.MyApp = window.MyApp || { Models : {}, Views : {}, Router : {} };
window.MyApp.Models.Author = Backbone.Models.extend({
initialize : function() { _.bindAll(this, 'validate') },
validator : $.get('/author/rules');
validate: function(attrs) {
// Loop each property of this model
_.each(attrs, function(field, value) {
// Get the regex from the validatior
var rule = this.validator[field];
var regex = new RegExp(rule);
if(!regex.test(value)) return "Model not valid.";
}
}
});
});
</script>
我是一步登天?
也许你正在做点什么!我想现在无法做到这一点,但可能有办法将它变成一个捆绑包!我建议在这种情况下不要使用ajax,因为每次加载验证规则都是很大的开销。但是从yml导出规则到定义不同正则表达式的JavaScript文件怎么样,所以你可以在backbone.js(或者你想要的任何javascript代码)中使用它们呢? – Sgoettschkes 2012-03-07 09:10:45
@Boo感谢您的评论。不幸的是我在Symfony2中并不擅长制作一个正确的版本。我认为从yaml到javascript的输出规则(然后再写javascript规则)是过度的 - 应该有一些直接从Symfony2获得“编译”规则的方法。 – gremo 2012-03-07 16:16:16
好吧,如果你打算使用ajax,你也可以在symfony中验证对象,并通过ajax返回消息返回验证结果。所以如果你想验证Author的名字,你发送一个请求到/ author/validate包含用户名,控制器使用symfony验证来验证它,如果验证成功或者不成功,返回。根据这个你显示错误信息。 – Sgoettschkes 2012-03-07 16:19:11