應該有可能暴露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