php - validaciones - Pregunta de MVC: ¿Debo poner reglas de validación de formulario en el controlador o modelo?
reglas de validacion en laravel (9)
Por un lado, la validación de formularios podría verse como parte de la lógica de la aplicación y, por lo tanto, pertenecer al modelo.
Por otro lado, trata directamente con la entrada proveniente de la vista y maneja los errores de visualización, etc. Desde ese ángulo, tiene más sentido colocarlo en los controladores.
¿Cuál es el enfoque correcto desde el punto de vista de MVC?
PD: la validación de mi formulario en realidad solo consiste en escribir una lista de campos, sus reglas y pasarla a una biblioteca de validación de formularios, que devuelve verdadero / falso sobre si aprobó la validación o no.
Ejemplo:
$this->load->library(''form_validation'');
$this->form_validation->set_rules(''name'', ''Name'', ''required'');
$this->form_validation->set_rules(''email'', ''Email'', ''required|valid_email'');
//........
if ($this->form_validation->validate())
// Process data
else
$this->register_form(); //A controller action that will show a view with errors
¿Debería ponerse esto en un controlador o modelo?
El modelo debe validar sus propios datos.
Supongamos que tiene un modelo de contacto, que solo requiere un nombre y un número de teléfono. Debe validar que el primer nombre y el número de teléfono estén completos.
Sin embargo, si este modelo de contacto es parte de una cotización, es posible que también necesite un nombre completo y una dirección de correo electrónico.
En ese caso, podría extender el modelo de contacto (para ser un modelo de QuoteContact) y agregar más validaciones, o podría hacer las validaciones adicionales en el modelo de presupuesto.
Debería escribir sus modelos de modo que sean reutilizables en otras aplicaciones (incluso si nunca lo serán), por lo que deberían ser independientes del controlador. Si las validaciones están en el controlador, entonces pierde esas validaciones si cambia para decir una versión de línea de comando.
Es una discusión teórica interesante, pero si nos centramos en el punto de que la pregunta fue hecha en el contexto de Codeigniter (CI):
En CI puede especificar una regla de validación personalizada como esta:
$this->form_validation->set_rules(''email'', ''Email'', ''required|callback_my_validation'');
En este escenario, debe definir una función pública llamada "my_validation" que debe devolver verdadero o falso y el marco agregará el error (si se devuelve falso) a una pila de errores.
Entonces ... si pones este código en el controlador, expones inadvertidamente una url pública , lo que significa que sería posible llamar algo así como " http://yoursite.com/my_validation " (no creo que pretendas que ) La única forma de proteger esta url sería ingresar al archivo "routes.php" e impedir el acceso a esta url. Esto no parece práctico y parece apuntarnos en la dirección en que los desarrolladores de CI pretendían que manejáramos la validación en el modelo.
Hay otro ángulo para esto que no está cubierto en las otras respuestas. ¡Depende de lo que diga que es Controlador / Vista ! Si es Javascript el que busca validación a medida que los usuarios escriben, por razones de seguridad también debería tener una validación en su backend (esto podría estar nuevamente en el controlador de su backend o modelo porque cualquiera puede simplemente pasar datos a través de Ajax sin el navegador.
Por motivos de rendimiento , también debe tener una validación en su controlador / vista frontal porque no desea acceder a su base de datos cada vez que un usuario selecciona una fecha de nacimiento no válida o algo así.
Por lo tanto, aparte de la base teórica de validación en M, V y / o C, también debe considerar la practicidad de frontend vs backend independientemente de MVC.
Mi recomendación personal es que no te limites a un solo nivel de validación. Una validación mal colocada (como el ejemplo de confirmación de contraseña mencionado en las otras respuestas) puede tener serias implicaciones en la arquitectura.
La validación es un problema del Modelo. Solo el modelo sabe cómo deberían ser sus datos. Usted describe sus campos de datos en el modelo, por lo que debe describir las reglas de validación para estos campos en el mismo lugar.
Parece ser obvio para mí, pero gustoso escucho a los oponentes.
Lo ideal es que quieras 3 capas de validación:
- Vista: lado del cliente (javascript, validación html5, etc.). Esto detecta errores obvios y omisiones antes de que los datos lleguen al controlador, desperdiciando el tiempo del usuario e invocando una carga de página innecesaria si hay errores.
- Controlador : esta es su capa de validación de Formulario . Por lo general, los controladores deben manejar la entrada directamente y enviarla al modelo. Es muy raro que cada campo en su formulario tenga una columna directamente relacionada en su base de datos, por lo general necesita modificar los datos de alguna manera antes de pasarlos al modelo. El hecho de que tenga un campo que necesita validar llamado "confirmar correo electrónico" no significa que su modelo tenga un valor de "confirmación de correo electrónico". A veces, este será el último paso de validación.
- Modelo : esta es su última línea de defensa para validación y, posiblemente, su única validación en el caso de enviar datos al modelo sin que procedan directamente de una publicación de formulario. Hay muchas ocasiones en las que necesita enviar datos a la base de datos desde una llamada de controlador, o con datos que no son ingresados por el usuario. No queremos ver errores de DB, queremos ver errores lanzados por la aplicación en sí. Por lo general, los modelos no deberían tratar directamente con los datos $ _POST o las entradas de los usuarios, sino que deberían recibir datos del controlador. No querrás lidiar con datos inútiles aquí, como la confirmación por correo electrónico.
Parece que todo el mundo siempre dice que el modelo depende de esta pregunta, que tiene sus méritos (en comparación con el opuesto), pero creo que la respuesta a la pregunta es más sutil. La validación de los datos se debe realizar en el modelo.
Pero existen otros tipos de validación , como si el formulario se envió con campos inesperados (por razones de seguridad, obviamente) o si un usuario tiene permiso para realizar la operación solicitada. Al poner estos tipos de validación en el modelo, cementa el modelo (una abstracción de los datos) para separar por completo las cosas, como el funcionamiento del sistema del usuario o cómo se evalúan los envíos de formularios por razones de seguridad.
Puedes imaginarte cambiando una de esas clases o sistemas de clases, y luego tener un lío porque también tienes que cambiar todos tus modelos. Mientras que los controladores son el mediador entre la entrada del cliente y los datos: en esa función, son los validadores adecuados de los ejemplos anteriores, y probablemente muchos otros.
Si valida el formulario en el servidor usando codeigniter, entonces lo valida en el controlador
Debe incluir la biblioteca form_validation usando autocarga como esta
$autoload[''libraries''] = array("form_validation")
O directamente carga en el Controlador
$this->load->library(''form_validation'');
A continuación, establece la regla de validación para cada campo de formulario
$this->form_validation->set_rules(''username'', ''User Name'', ''required'');
$this->form_validation->set_rules(''useremail'', ''User Email'', ''required|valid_email'');
Si se encuentra un error después de la validación de un campo de formulario, se captura en la función de validación
if ($this->form_validation->validate()) {
//return back to form
} else {
//successful validate all field
}
Tomando en cuenta otras respuestas (y algunas investigaciones), si tiene que validar datos con reglas como campos no vacíos, validación de correo electrónico y demás, el Controlador no debe permitir que estos datos pasen por sí mismo, pero si tiene reglas como "solo un usuario con una reputación superior a 150 puede rechazar una respuesta ", debe hacer esto en la capa de modelo.
Si desea validar las reglas comerciales, le aconsejo que tenga un objeto como el Patrón de Objeto Comercial , con eso, en cualquier parte del software, cuando quiere "votar por una respuesta", su lógica de negocios se conserva y se centraliza.
Yo diría que el código de validación de formulario debe estar en el controlador (no en el modelo) en la mayoría de los casos.
Madmartigan lo expresó mejor en su comentario anterior "Validación de formulario! == Validación de datos. No todas las formas interactúan con un modelo"
Los formularios web son lógicamente parte de la parte Ver / Controlador de MVC, ya que el usuario interactúa con ellos en la vista.