2010-01-15 13 views
20

Tengo una aplicación MVC que recibe una entrada de un formulario.
Este es un formulario de inicio de sesión por lo que la única validación que es necesaria es comprobar si la entrada no está vacía.
Ahora mismo, antes de pasarlo al modelo, lo valido en el controlador.
¿Es esta una buena práctica o no? ¿Pertenece al modelo?¿Dónde pertenece la validación de entrada en una aplicación MVC?

+0

Respuesta simple: [ponerlo donde se necesita.] (Http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/02/15/validation-in-a-ddd-world.aspx) –

Respuesta

12

No creo que haya una mejor práctica oficial que limite la validación a cualquier parte del patrón MVC. Por ejemplo, su vista puede (y debe) hacer una validación inicial usando Javascript. Su controlador también debe ofrecer los mismos tipos de validación, así como más validación relacionada con la lógica de negocios. El modelo también puede ofrecer formas de validación, es decir, establecedores que no permiten valores nulos.

Hay una discusión interesante de este at joelonsoftware.

+0

Este es un framework web en C++, no es necesario javascript. –

+0

Supongo que hay algo de Javascript en algún lugar de la aplicación? A menos que sea una aplicación o marco web anticuado de estilo Web 1.0. –

+0

No es pero no lo toco/código/manejo a menos que realmente realmente lo desee :) En este marco, la Vista solo crea e inicializa los widgets y los conecta al widget raíz. Aunque puede tener funciones de validación. Entonces, ¿la vista es el lugar para validar si los datos no están vacíos pero el modelo es para verificar que el nombre de usuario y la contraseña ingresados ​​son correctos? –

0

Su lógica comercial, entonces no, no pertenece al modelo.

+0

La respuesta a continuación afirma lo contrario. Por favor, elabore y explique por qué cree que sí. –

+1

Probablemente iré por la ruta darren que se describe a continuación. En ese caso, iría en su capa de servicio. Básicamente, piense de esta manera; no está permitiendo que una cadena vacía sea una restricción impuesta por el modelo? Y no es una preocupación UI. Entonces debe ser una preocupación comercial; un usuario no puede iniciar sesión con un nombre de usuario vacío. – brian

+2

Uh. Si su MVC apropiadamente, la lógica comercial PERTENECE en el modelo, no en la vista o el controlador. La lógica de aplicación pertenece al controlador y la vista es la vista. Podría decirse que la validación no es lógica comercial sino lógica de la aplicación, pero eso es una especie de división de pelos. – Shayne

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

La respuesta anterior dice que es lógica de negocios, por lo que no pertenece al modelo. ¿Estás diciendo que funciona bien? Estoy confundido. Por favor, elabore y explique por qué cree que sí. –

+2

No estoy de acuerdo. Diría: Business Logic -> Domain; Lógica de interfaz de usuario -> Controlador; Validación -> Dominio + UI (opcional) –

+0

@the_drow: Estoy diciendo que la lógica empresarial ** no ** pertenece al Modelo, pertenece al Controlador. –

0

Asumiendo que su aplicación está estructurado como:

  • Modelo-Vista-Controlador
  • Servicio
  • Persistencia
  • Modelo

La entrada del usuario llegaría a su controlador, y usaría servicios en la capa de servicio para validarlo.

+1

Más capas? ¿Cuál es la capa de servicio?No hay una base de datos, por lo que no hay persistencia per se, todos los datos se toman de otro proceso y todos los datos se cambian desde la interfaz de usuario o el proceso. –

6

He estado pensando en esto durante MUCHO tiempo y después de intentar validar tanto en controladores como en modelos ... finalmente he llegado a la conclusión de que para muchas de mis aplicaciones ... la validación pertenece al modelo y no en el controlador. ¿Por qué? Debido a que el mismo modelo podría ser utilizado en el futuro por varias otras llamadas de controlador o API ... y luego tendría que repetir el proceso de validación una y otra vez. Eso violaría DRY y provocaría muchos errores. Además, filosóficamente es el modelo que interactúa con la base de datos (u otro almacenamiento persistente) y, por lo tanto, es una especie de lugar de "última llamada para el alcohol" para hacer esto de todos modos.

Así que hago mi traducción de obtención/publicación en el controlador y luego envío datos sin procesar al modelo para su validación y procesamiento. Por supuesto, a menudo estoy haciendo aplicaciones web php/mysql y si está haciendo otras cosas, los resultados pueden variar. Espero que esto ayude a alguien.

1

de validación debe estar en el Modelo

Sólo el modelo conoce los "detalles" de la empresa. solo el modelo sabe qué datos son aceptables y cuáles no. el controlador solo sabe cómo "usar" el modelo.

por ejemplo: digamos que necesitamos la funcionalidad de registrar nuevos usuarios en nuestro sistema.

El Modelo:

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; 
} 

Ahora el controlador/s trabajo es "utilizar" la función del modelo registerUser() sin el conocimiento de cómo el modelo se va a hacer la validación, o incluso lo que se considera "válido " ¡o no!

el controlador:

$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 

El usuario clase

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

que tiene una arquitectura como que va a "libres" los controladores completamente a partir de los detalles de la lógica de negocio -que es una buena cosa- .

Supongamos que queremos hacer otra forma de registro de usuario en otro lugar en el sitio web (y tendremos otro controlador asignado para ello). ahora el otro controlador usará el mismo método del modelo registerUser().

Pero si distribuimos la lógica de validación entre el controlador y el modelo, no se separarán -lo cual es malo y en contra de MVC- lo que significa que cada vez que necesite hacer una nueva vista y controlador para registrar un nuevo usuario debe usar el mismo viejo controlador Y el modelo juntos. Además, si se cambia la lógica comercial (ahora aceptamos a los adolescentes en nuestro club deportivo), solo cambiará el código en la función modelo registerUser(). el código de los controladores sigue siendo el mismo.

Cuestiones relacionadas