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?
Respuesta
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.
Este es un framework web en C++, no es necesario javascript. –
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. –
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? –
Su lógica comercial, entonces no, no pertenece al modelo.
La respuesta a continuación afirma lo contrario. Por favor, elabore y explique por qué cree que sí. –
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
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
Business Logic -> Controller
Data Validation -> Model
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í. –
No estoy de acuerdo. Diría: Business Logic -> Domain; Lógica de interfaz de usuario -> Controlador; Validación -> Dominio + UI (opcional) –
@the_drow: Estoy diciendo que la lógica empresarial ** no ** pertenece al Modelo, pertenece al Controlador. –
Dentro del controlador, tiene la propiedad ModelState a la que puede agregar errores de validación.
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.
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. –
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.
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.
- 1. ¿Dónde pertenece la lógica de procesamiento de formularios en una aplicación web MVC?
- 2. Validación de entrada de ASP.NET MVC
- 3. MVC: ¿dónde implementar la validación de formularios (en el lado del servidor)?
- 4. ¿Dónde incluir la funcionalidad SMS en una aplicación MVC?
- 5. asp.net entrada de mvc/validación de modelo multi idioma
- 6. ¿Dónde está el punto de entrada para una aplicación Rails?
- 7. ¿Dónde se realiza la validación?
- 8. ¿Dónde puedo encontrar una aplicación PHP MVC de muestra?
- 9. ¿A dónde pertenece el archivo .gitignore?
- 10. Dónde pongo métodos comunes en la aplicación MVC
- 11. MVC 3 discreta validación - condicionalmente desactivar/activar la validación
- 12. Cambie la clase CSS de una entrada de error de validación con la maquinilla de afeitar
- 13. Validación en Spring MVC
- 14. HTML codificación en la entrada MVC
- 15. validación de imágenes en MVC
- 16. MomentJS: ¿pensado para la validación de entrada?
- 17. ¿De dónde vino aspnetdb.mdf en mi aplicación ASP.NET MVC?
- 18. ¿Dónde debería crear la instancia de unidad de trabajo en una aplicación ASP.Net MVC 3?
- 19. ¿Dónde debe implementarse la lógica de validación?
- 20. Entrada de cuadro de validación
- 21. ¿Dónde colocar el código de la página maestra en una aplicación MVC?
- 22. ¿Dónde colocar los archivos javascript específicos de la vista en una aplicación ASP.NET MVC?
- 23. ¿Dónde se sienta JavaScript en el patrón MVC de una aplicación web?
- 24. ¿Dónde se registran las reglas de validación para los datos del formulario en una aplicación web?
- 25. Validación de entrada CheckBox en Django
- 26. Validación de la entrada de Cyrilic en PHP
- 27. Diseñando errores de validación de ASP.NET MVC?
- 28. Validación de una entrada entera desde un formulario
- 29. Solicitar validación - ASP.NET MVC 2
- 30. La validación del modelo ASP.NET MVC rompe la regla MVC?
Respuesta simple: [ponerlo donde se necesita.] (Http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/02/15/validation-in-a-ddd-world.aspx) –