2009-10-08 28 views
8

Tôi đang sử dụng Kohana, nhưng tôi nghĩ câu hỏi này tổng quát hơn.Xác nhận biểu mẫu sẽ xảy ra ở đâu trong dự án MVC?

Tôi đã thực hiện xác nhận biểu mẫu trong bộ điều khiển và nó đã hoạt động tốt cho đến nay. Nhưng gần đây, tôi đã gặp phải một vấn đề.

Tôi có mô hình nhận xét và tôi gửi nhận xét từ một vài bộ điều khiển khác nhau đến nó. Thay vì có một trình xác nhận hợp lệ trong mọi bộ điều khiển, tôi đã đặt nó trong mô hình.

này là rất tốt vì

  • Chỉ có một nơi để thay đổi/thêm các quy tắc xác nhận (DRY)

này sucks vì

  • Tôi rõ ràng là cần phải trả lại một thành công hay thất bại đến bộ điều khiển và thư viện xác nhận của Kohana trả về lỗi dưới dạng mảng. Vì vậy, sự trở lại của tôi trông như thế này

VỀ THÀNH CÔNG

array('success' => true); 

ON FAIL

array('success' => false, $errors); 

tôi không thể không nghĩ rằng điều này là sai. Nó cảm thấy sai.

Nếu tôi làm điều đó trong bộ điều khiển, tôi chỉ đơn giản có thể làm

if ($post->validate()) { 
    doWhatever(); 
} else { 
    $this->template->formErrors = $post->errors('form_errors'); 
} 

Mà dường như tốt hơn (với tôi).

Có cách nào tốt hơn để thực hiện việc này không? Tôi có nên xác nhận trong bộ điều khiển hoặc phương pháp? Tôi có phát điên không?

+0

Đó là cách tôi làm điều đó và sau đó kiểm tra chỉ số thành công để quyết định làm gì (không phải với Kohona, nhưng nói chung.) –

Trả lời

4

Tôi thành thật không thấy có gì sai với phương pháp của bạn, alex. Có vẻ như bạn đang làm đúng cách. Bạn đang theo nguyên tắc DRY, mà đối với tôi thường là thước đo để đo nếu tôi làm điều gì đó đúng khi nói đến MVC.

0

Tôi không muốn lặp lại chính mình qua cảm xúc, làm phương pháp. Bên cạnh đó mảng là tiện dụng vì bạn có thể hiển thị các lỗi từ mảng trong một khung nhìn nếu bạn muốn. Tôi đã không sử dụng kohana, nhưng các phương pháp xác nhận tôi đã được sử dụng trong ASP.NET MVC cung cấp cho tôi một danh sách tương tự và sau đó tôi có thể hiển thị cho người dùng những gì chính xác là sai.

0

Bạn nên luôn luôn (nếu bạn có thể) xác thực trên máy khách (JS). Và kể từ đó có thể được bỏ qua - bạn xác nhận trên máy chủ là tốt. Và có - việc xác thực của bạn cho một số biểu mẫu có thể tái sử dụng là ý tưởng tuyệt vời

+0

Trừ khi bạn troll người chỉ muốn di chuyển câu trả lời của bạn - cung cấp một lịch sự giải thích lý do tại sao bạn đang đưa ra -1 cho câu trả lời này. Xác thực trên máy khách - có nghĩa là nó nhanh hơn rất nhiều rồi quay lại máy chủ. Nhưng dựa vào khách hàng một mình là nguy hiểm vì nó có thể dễ dàng bị phá vỡ. Do đó câu trả lời của tôi – Bostone

+0

Tôi nghĩ bạn nên nỗ lực nhiều hơn vào câu trả lời ngay từ đầu, không chỉ trong phần bình luận. Chỉ để trở thành một thẩm phán, tôi đã biên soạn kẻ phá hoại khốn kiếp đó. :) – pestaa

+0

Cảm ơn bạn :) Không phải tất cả các câu trả lời của tôi đều ngắn gọn. Tôi chỉ cố gắng thêm giọng của mình vào điệp khúc – Bostone

2

Mô hình chất béo. Bộ điều khiển nhỏ. Đó là cách tôi luôn làm. Xác thực với tôi là ở lớp dữ liệu. Lớp dữ liệu (với tôi, ít nhất) là mô hình. Tôi thường sử dụng CakePHP làm khung MVC của tôi ... Có lẽ đó là lý do tại sao xác nhận của tôi là ở mô hình. Đó là cách của CakePHP.

0

Tôi cũng xác thực trong mô hình. Hầu hết các mô hình lib như ORM, Auto_Modeler vv cũng hỗ trợ xác nhận. BTW sẽ nhanh hơn nếu bạn hỏi trên kênh #kohana trên FreeNode (irc.freenode.net).Chúng tôi (thường) không cắn :)

6

Tôi không nghĩ rằng tất cả các quy tắc xác thực có thể đi vào bên trong mô hình. Xác thực là tất cả về hình thức (hoặc API). Thực tế là khi bạn đang xác thực dữ liệu của mình, hầu hết mọi thứ phụ thuộc vào ngữ cảnh .

Ví dụ: đây có phải là người dùng đã đăng nhập thực hiện hành động không? Bạn sẽ không ghép lớp xác thực của mình với mô hình đang được xác thực. Vì vậy, tất cả các kiểm tra phải đi bên trong bộ điều khiển. Mô hình là bối cảnh bất khả tri; dạng "thuộc về" đối với bộ điều khiển và nhận biết ngữ cảnh.

Tôi nghĩ rằng có quy tắc xác nhận mỗi hình thức cộngcơ bản kiểm tra trong mô hình đối với dữ liệu cũng như hình thành là con đường để đi. Nếu bạn đang gọi Auth :: instance() hoặc Session :: instance() bên trong hàm validate() của mô hình, thì bạn đang làm sai.

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