2010-01-15 15 views
20

Tôi có một ứng dụng MVC nhận đầu vào từ một biểu mẫu.
Đây là biểu mẫu đăng nhập để xác thực duy nhất cần thiết là kiểm tra xem đầu vào có trống không.
Ngay bây giờ trước khi tôi chuyển nó cho mô hình, tôi xác nhận nó trong bộ điều khiển.
Đây có phải là phương pháp hay nhất hay không? Nó có thuộc về mô hình không?Xác nhận đầu vào ở đâu thuộc về ứng dụng MVC?

+0

Câu trả lời đơn giản: [đặt nó ở nơi cần thiết.] (Http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/02/15/validation-in-a-ddd-world.aspx) –

Trả lời

12

Tôi không nghĩ rằng có một phương pháp hay nhất chính thức giới hạn xác thực cho bất kỳ phần nào của mẫu MVC. Ví dụ, xem của bạn có thể (và nên) làm một số xác nhận phía trước bằng cách sử dụng Javascript. Bộ điều khiển của bạn cũng nên cung cấp cùng một loại xác thực, cũng như xác thực liên quan đến logic kinh doanh hơn. Mô hình cũng có thể cung cấp các hình thức xác thực, tức là, người định cư không cho phép các giá trị null.

Có một cuộc thảo luận thú vị về điều này at joelonsoftware.

+0

Đây là một khung công tác web trong C++, không cần javascript. –

+0

Tôi giả sử có một số Javascript ở đâu đó trong ứng dụng? Trừ khi đây là một khung ứng dụng web theo phong cách Web 1.0 kiểu cũ. –

+0

Có nhưng tôi không chạm/mã/xử lý trừ khi tôi thực sự thực sự muốn :) Trong khung này, Chế độ xem chỉ tạo và khởi tạo các tiện ích và đính kèm chúng vào tiện ích gốc. Nó có thể có chức năng xác nhận trong nó mặc dù. Vì vậy, xem là nơi để xác nhận nếu dữ liệu không trống nhưng mô hình là để xác minh rằng tên người dùng và mật khẩu đầu vào là chính xác? –

0

Logic nghiệp vụ của nó, vì vậy không, nó không thuộc về mô hình.

+0

Câu trả lời dưới đây tuyên bố khác. Xin hãy giải thích và giải thích tại sao bạn lại nghĩ vậy. –

+1

Tôi có thể sẽ đi các tuyến đường darren được nêu dưới đây. Trong trường hợp đó, nó sẽ đi vào lớp dịch vụ của bạn. Về cơ bản, hãy nghĩ về nó như thế này; không cho phép một chuỗi rỗng một ràng buộc được đặt trên bạn bởi mô hình? Và nó không phải là một mối quan tâm UI. Vì vậy, nó phải là một mối quan tâm kinh doanh; người dùng không thể đăng nhập bằng tên người dùng trống. – brian

+2

Uh. Nếu bạn làm MVC đúng logic kinh doanh BELONGS trong mô hình, không phải là xem hoặc bộ điều khiển. Logic ứng dụng thuộc về bộ điều khiển, và khung nhìn là khung nhìn. Có thể cho rằng xác thực không phải là logic nghiệp vụ mà là logic ứng dụng, nhưng đó là loại phân tách lông. – Shayne

-3
Business Logic -> Controller 
Data Validation -> Model 
+0

Câu trả lời trên cho biết đó là logic nghiệp vụ nên nó không thuộc về mô hình. Bạn đang nói rằng nó có đúng không? Tôi đang bối rối. Xin hãy giải thích và giải thích tại sao bạn lại nghĩ vậy. –

+2

Tôi không đồng ý. Tôi sẽ nói: Business Logic -> Domain; Logic giao diện người dùng -> Bộ điều khiển; Xác nhận -> Miền + Giao diện người dùng (tùy chọn) –

+0

@ the_drow: Tôi đang nói rằng logic nghiệp vụ ** không ** thuộc về Mô hình, nó thuộc về Bộ điều khiển. –

0

Giả sử ứng dụng của bạn được cấu trúc như:

  • MVC
  • Dịch vụ
  • Persistence
  • Mẫu

Các đầu vào người dùng sẽ đến để điều khiển của bạn, và bạn sẽ sử dụng các dịch vụ trong lớp dịch vụ để xác thực nó.

+1

Các lớp khác? Lớp dịch vụ là gì?Không có cơ sở dữ liệu để không có sự kiên trì, tất cả dữ liệu được lấy từ một tiến trình khác và tất cả dữ liệu được thay đổi từ giao diện người dùng hoặc quá trình. –

6

Tôi đã suy nghĩ về điều này trong một thời gian dài và sau khi thử đặt xác nhận trong cả hai bộ điều khiển và mô hình .... cuối cùng tôi đã đi đến kết luận rằng đối với nhiều ứng dụng của tôi ... xác nhận thuộc về mô hình và không có trong bộ điều khiển. Tại sao? Bởi vì cùng một mô hình có thể trong tương lai được sử dụng bởi các cuộc gọi hoặc API điều khiển khác nhau ... và sau đó tôi sẽ phải lặp lại quá trình xác nhận lặp đi lặp lại. Điều đó sẽ vi phạm DRY và dẫn đến nhiều lỗi. Cộng với triết lý của nó mô hình tương tác với cơ sở dữ liệu (hoặc lưu trữ liên tục khác) và do đó là sắp xếp của một 'cuộc gọi cuối cùng cho rượu' nơi để làm điều này anyway.

Vì vậy, tôi thực hiện dịch/nhận bản dịch trong bộ điều khiển và sau đó gửi dữ liệu thô đến mô hình để xác thực và xử lý. Tất nhiên tôi thường làm các ứng dụng web php/mysql và nếu bạn đang thực hiện các kết quả khác thì có thể khác nhau. Tôi hi vọng điêu nay se giup được ai đo.

1

Validation phải nằm trong mẫu

Chỉ có mô hình biết những "chi tiết" của doanh nghiệp. chỉ mô hình biết dữ liệu nào được chấp nhận và dữ liệu nào không được chấp nhận. bộ điều khiển chỉ biết cách "sử dụng" mô hình. Ví dụ:

ví dụ: giả sử chúng ta cần chức năng đăng ký người dùng mới cho hệ thống của chúng tôi.

Model:

public function registerUser(User $user){ 
    //pseudo code 
     //primitive validation 
     if(!isInt($user->age)){ 
      //log the invalid input error 
      return "age"; 
     } 
     if(!isString($user->name)){ 
      //log the invalid input error 
      return "name"; 
     } 
     //business logic validation 

     //our buisnees only accept grown peoples 
     if($user->age < 18){ 
      //log the error 
      return "age"; 
     } 
     //our buisness accepts only users with good physique 
     if($user->weight > 100){ 
      //log the error 
      return "weight"; 
     } 
     //ervery thing is ok ? then insert the user 
     //data base query (insert into user (,,,) valeues (?,?,?,?)) 
     return true; 
} 

Bây giờ điều khiển/s công việc là để "sử dụng" chức năng mô hình registerUser() mà không có kiến ​​thức về cách thức mô hình đang xảy ra để làm xác nhận, hoặc thậm chí những gì được coi là "hợp lệ " hay không!

Controller:

$user = new User(); 
$user->age = isset($_POST['age']) ? $_POST['age'] : null; 
$user->name = isset($_POST['name']) ? $_POST['name'] : null; 
$user->age = isset($_POST['weight']) ? $_POST['weight'] : null; 
$result = $theModel->registerUser($user);// <- the controller uses the model 
if($result === true){ 
//build the view(page/template) with success message and die 
} 
$msg = ""; 
//use the return value from the function or you can check the error logs 
switch ($result){ 
    case"age" : 
     $msg = "Sorry, you must be over 18"; 
     break; 
    case "name": 
     $msg = "name field is not correct"; 
     break; 
    case "weight": 
     $msg = "Sorry, you must have a good physique"; 
     break; 
} 
//build the view(page/template) with error messages and die 

Người dùng lớp

class User { 
    public $age; 
    public $name; 
    public $weight; 
} 

có một kiến ​​trúc như vậy sẽ "miễn phí" các bộ điều khiển hoàn toàn từ các chi tiết của logic kinh doanh -which là một thing- tốt .

Giả sử chúng tôi muốn tạo một hình thức đăng ký người dùng khác ở một nơi khác trên trang web (và chúng tôi sẽ có một trình điều khiển khác được phân bổ cho nó). bây giờ bộ điều khiển khác sẽ sử dụng cùng một phương thức của mô hình registerUser().

Nhưng nếu chúng tôi phân phối logic xác nhận giữa bộ điều khiển và mô hình, chúng sẽ không được tách biệt - điều xấu và chống lại MVC - nghĩa là mỗi lần bạn cần tạo chế độ xem và bộ điều khiển mới để đăng ký người dùng mới, bạn phải sử dụng cùng một bộ điều khiển cũ và mô hình cùng nhau. Hơn nữa, nếu logic nghiệp vụ thay đổi (bây giờ chúng tôi chấp nhận thanh thiếu niên trong câu lạc bộ thể thao của chúng tôi), bạn sẽ chỉ thay đổi mã trong hàm registerUser() mô hình. mã bộ điều khiển vẫn giống nhau.

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