2012-03-07 45 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的支持。