2012-03-07 27 views
9

Có thể hiển thị Symfony2 quy tắc xác thực (cho một thực thể nhất định) không? Tôi không thể tìm thấy gì như thế này. Tôi đang cố gắng xác thực phía máy khách (sử dụng backbone.js) với phương pháp DRY. Một cái gì đó giống như một bó hoặc bất kỳ mẹo nào sẽ giúp ích cho bạn.Chia sẻ quy tắc xác thực của Symfony2 với backbone.js hoặc javascript nói chung?

Here is trình xác thực thành phần. Một khả năng có thể là:

Xác định xác thực phía máy chủ quy tắc sử dụng cách tiêu chuẩn của Symfony2. Ví dụ (YAML, lấy từ trang web của họ):

# src/Acme/BlogBundle/Resources/config/validation.yml 
Acme\BlogBundle\Entity\Author: 
    properties: 
     name: 
      - NotBlank: ~ 

Make /author/rules trả về một đối tượng JSON mà bản đồ các lĩnh vực từ các tổ chức với một "biên soạn" biểu thức chính quy. Tôi không chắc chắn về điều này nhưng tôi nghĩ rằng nội bộ Symfony2 biên dịch các quy tắc validation.yml thành các biểu thức chính quy.

Giả sử một thực thể giả làm bằng name lĩnh vực với NotBlank (lưu ý tôi không phải là một bậc thầy trong regex, đây là một sao chép và dán từ một câu hỏi khác):

{ 'name' : '^\s*\S' } 

Cuối cùng lấy đối tượng JSON và làm xác thực phía máy khách với hệ thống backbone.js. Có thể lưu vào bộ nhớ cache. Ví dụ: (cảnh báo! Mã giả giống mã bên trong 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> 

Tôi có yêu cầu mặt trăng không?

+0

Có thể bạn đang sử dụng thứ gì đó! Tôi đoán không có cách nào để làm điều đó ngay bây giờ, nhưng có thể có một cách để biến điều này thành một bó! Tôi sẽ đề nghị không sử dụng ajax trong trường hợp này, đơn giản chỉ vì tải các quy tắc xác nhận mỗi lần là một chi phí rất lớn. Nhưng những gì về xuất khẩu các quy tắc từ yml vào một tập tin javascript mà định nghĩa regex khác nhau để bạn có thể sử dụng chúng với backbone.js (hoặc bất kỳ mã javascript bạn muốn)? – Sgoettschkes

+0

@Boo cảm ơn nhận xét của bạn. Thật không may tôi không phải là tốt trong Symfony2 để làm cho một gói phải biết.Và tôi nghĩ rằng việc xuất các quy tắc từ yaml sang javascript (và sau đó viết các quy tắc javascript - một lần nữa) là quá mức cần thiết - nên có một số cách để nhận các quy tắc "được biên dịch" trực tiếp từ Symfony2. – gremo

+0

Vâng, nếu bạn định sử dụng ajax, bạn cũng có thể xác thực đối tượng trong symfony và trả về kết quả của việc xác nhận thông qua thông báo trả về ajax. Vì vậy, nếu bạn muốn xác nhận tên của tác giả, bạn gửi một yêu cầu đến/author/validate chứa tên người dùng, controller sẽ xác nhận hợp lệ nó bằng cách sử dụng xác nhận hợp lệ của symfony và trả về nếu xác thực thành công hay không. Tùy thuộc vào điều này bạn hiển thị thông báo lỗi. – Sgoettschkes

Trả lời

0

Gói vật phẩm này có thể phù hợp với nhu cầu của bạn APYJsFormValidationBundle

Tuy nhiên nó hiện đang hạn chế để khẳng định chế xác định, áp dụng cho các đơn vị.

Hỗ trợ cho các ràng buộc được xác định php, yml và xml nằm trong danh sách việc cần làm.

0

Bạn có thể thử nhóm này. Tôi đã sử dụng nó với sự thành công khác nhau trong quá khứ.

https://github.com/formapro/JsFormValidatorBundle

Nó xuất khẩu tất cả các quy tắc xác nhận Symfony và bãi sau đó vào một cấu trúc dữ liệu JS. Sau đó, có nhiều người trợ giúp khác nhau để cho phép bạn thực thi các xác thực này. Ngoài ra, hãy nhớ tắt xác thực biểu mẫu HTML5 bằng <form novalidate="novalidate"> v.v.

Tôi nghĩ rằng nó có thể bị giới hạn ở Symfony < = 2.6 nhưng tôi đã làm việc đó với Symfony 2.7.7. Các nhà bảo trì hiện đang làm việc với sự hỗ trợ của Symfony 3.0 mà tôi nghĩ.

Các vấn đề liên quan