2012-03-07 54 views
9

应该有可能暴露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> 

我是一步登天?

+0

也许你正在做点什么!我想现在无法做到这一点,但可能有办法将它变成一个捆绑包!我建议在这种情况下不要使用ajax,因为每次加载验证规则都是很大的开销。但是从yml导出规则到定义不同正则表达式的JavaScript文件怎么样,所以你可以在backbone.js(或者你想要的任何javascript代码)中使用它们呢? – Sgoettschkes 2012-03-07 09:10:45

+0

@Boo感谢您的评论。不幸的是我在Symfony2中并不擅长制作一个正确的版本。我认为从yaml到javascript的输出规则(然后再写javascript规则)是过度的 - 应该有一些直接从Symfony2获得“编译”规则的方法。 – gremo 2012-03-07 16:16:16

+0

好吧,如果你打算使用ajax,你也可以在symfony中验证对象,并通过ajax返回消息返回验证结果。所以如果你想验证Author的名字,你发送一个请求到/ author/validate包含用户名,控制器使用symfony验证来验证它,如果验证成功或者不成功,返回。根据这个你显示错误信息。 – Sgoettschkes 2012-03-07 16:19:11

回答

0

这束可满足您的需求APYJsFormValidationBundle

然而,目前仅限于断言定义的约束,适用于实体。

支持php,yml和xml定义的约束条件在todo列表中。

0

你可以试试这个包。过去我已经用它取得了不同的成功。

https://github.com/formapro/JsFormValidatorBundle

它导出所有的Symfony验证规则,并在一个JS数据结构,那么转储。然后有各种助手允许你执行这些验证。还记得要禁用HTML5表单验证<form novalidate="novalidate">

我认为它可能只限于Symfony < = 2.6,但我已经得到它的Symfony 2.7.7。维护者目前正在研究Symfony 3.0的支持。