Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

PHP OO Validación en controller o en model?

Estas en el tema de Validación en controller o en model? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Aquí va mi primer mensaje ¿ Por qué la validación de datos que van a pasarse a un modelo (o varios) se suele hacer en ...
  #1 (permalink)  
Antiguo 14/01/2011, 01:17
 
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 8
Antigüedad: 13 años, 3 meses
Puntos: 0
Validación en controller o en model?

Aquí va mi primer mensaje

¿ Por qué la validación de datos que van a pasarse a un modelo (o varios) se suele hacer en el controlador y no en el propio modelo ?

Al fin y al cabo, el modelo es el que sabe que datos maneja; y si tenemos tres o cuatro controladores que modifican datos, no hace falta repetir la validación, bastaría con algo así:

Código PHP:
$cliente->nombre $_POST['nombre'];
$cliente->apellidos $_POST['apellidos'];

if (
$errores $cliente->validar())
{
 
print_r($errores);
} else {
   
$cliente->guardar();

  #2 (permalink)  
Antiguo 14/01/2011, 01:35
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Validación en controller o en model?

creo que depende mucho de lo que manejas con tu modelo...

si la validación la haces dentro de el, entonces tiende a ser restringida hasta cierto punto... si manejas la validación fuera, no tendrás problemas con la flexibilidad en el modelo...

en otros escenarios es claramente mejor validar en el propio modelo, pero no sin antes despejar otro tipo de incógnitas que pudieran relacionar al modelo bajo otras circunstancias...

al final tienes bastante razón en lo de repetir código, pero te coloco un escenario simple: backend v.s. frontend

si usas exactamente el mismo modelo, con validaciones incluidas, puedes encontrarte con problemas a la hora de crear algún registro, modificarlo, etc...

algunas veces el frontend cuenta con formularios mas simplificados, que tienden a ser reforzados gracias a la lógica de los controladores, en el backend no siempre pasa este problema, pues la forma en que administramos la información no siempre será igualmente introducida...
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 14/01/2011, 02:05
 
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 8
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Validación en controller o en model?

Si, la verdad es que en una situación con dos controladores con distinto nivel de acceso puede que la validación necesite ser más flexible.

Pero eso permite que, por un despiste en la programación de algún controlador, o por olvidar validar todos los datos recibidos de un formulario, fichero csv, ... , el modelo trabaje con datos inconsistentes.
  #4 (permalink)  
Antiguo 14/01/2011, 07:08
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Validación en controller o en model?

Buena pregunta viriathus, el problema es que no hay consenso al respecto, depende mucho del contexto y del tipo de aplicación, en tu ejemplo, en que contexto el objeto no es valido ?, no es valido para la persistencia, o se creo en un estado invalido ?, si se creo en un estado invalido, esto debería permitirse ?, en mi caso por lo general la validación la utilizo en el Service Layer, esto me funciona bien para aplicaciones standard's, pero en el caso de una aplicacion compleja ?, el sistema de un banco por ejemplo, seguramente tengas que hacer validaciones en diferentes niveles, desde la ui al database.
Te dejo un link para que leas diferentes opiniones al respecto.

Saludos.
  #5 (permalink)  
Antiguo 14/01/2011, 07:10
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 3 meses
Puntos: 44
Respuesta: Validación en controller o en model?

Pues yo suelo validar en el modelo. En el caso de que se de un dato excepcional o alguna inconsistencia, simplemente el controlador se lo hace saber al modelo.

Lo hago básicamente para evitar repetir mucho código, tal y como mencionas, pero no se si en la teoría está bien hecho.

Saludos!
  #6 (permalink)  
Antiguo 14/01/2011, 07:22
Avatar de CodeIgniter  
Fecha de Ingreso: enero-2011
Ubicación: $this->load->view('Rafaela', 'Argentina')
Mensajes: 44
Antigüedad: 13 años, 3 meses
Puntos: 14
Respuesta: Validación en controller o en model?

Según mis conocimientos acerca del modelo MVC, es correcto que las validaciones sean efectuadas por un controlador (en lugar de un modelo).

La función de los modelos (capa datos) es llevar y traer información de la base de datos y derivarla al controlador (capa lógica) para que éste la procese, tome decisiones y devuelva respuesta al usuario mediante una vista (capa presentación).

Tené presente que los controladores manejan la parte lógica del software, es decir definen su comportamiento... Si ocurre una determinanda condición, hacer algo.... Si ocurre otra condición...., hacer otra cosa....

En tu caso con las validaciones el trabajo del controlador sería:

Si usuario existe y password ingresada es correcta, aprobar el login del usuario y presentarle la pantalla de Inicio al sistema.

Para saber si el usuario existe en la base de datos y la pass es correcta, se apoya en los servicios de un modelo.

La gran ventaja de esta metodología de trabajo es que tenés todo bien separado, por un lado el código php (controladores), por otro lado las consultas Mysql (modelos) y por otro el código Html (vistas).

En consecuencia, tu código es más compacto, comprensible y fácil para mantener...

Espero que la info te sirva de ayuda, saludos.-
  #7 (permalink)  
Antiguo 14/01/2011, 10:10
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Validación en controller o en model?

@CodeIgniter, es una cuestión un poco diferente, te dejo este link para que le des una leida, si bien se puede validar en cualquier parte (modelo/controller) depende mucho del contexto de la aplicación y el tamaño.

Expongo el caso de una aplicación que manejo, utiliza mucho código para procesos batch (es decir no hay ningún GUI) y los datos se procesan de información que envían otros equipos. Si bien se podría validar en el controller, al ser procesos batch que interactuan con modelos en específico, hay que validar esos datos en el modelo y en dado caso informar al proceso que hay datos incorrectos.

Pero también al tener un GUI para consultas y ediciones, tiene que haber validación en el formulario, y si llegamos a un punto de casi repetir código (el validar con Zend_Form, y el validar en el modelo) pero son reglas muy diferentes las que se aplican, aunque por encima se vean similares (por ejemplo campo user no puede estar vacio).

El tenerlo de esa forma nos hace tener una mejor consistencia de datos para poder trabajar, y lo veo como la eterna discusión: "Validar en el cliente o en el servidor? (Javascript vs PHP)", y la respuesta casi siempre es la misma: en ambos.

Así que aquí mi respuesta sería igual: en ambos si la aplicación lo permite. Si es una aplicación sencilla mantenida por 1 programador igual te puedes evitar esa tarea, pero si estas trabajando en una aplicación por más de 2 programadores que cada quien esta encargado de una capa en especial, es mejor que cada capa tenga sus reglas de validación.
  #8 (permalink)  
Antiguo 14/01/2011, 12:10
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Validación en controller o en model?

Es cierto que la mejor opción a la hora de validar en javascript o PHP, es en los dos lados, pero los motivos son diferentes a los que yo entiendo con tu ejemplo GatorV.

En el caso de javascript y PHP, creo que la opcion preferente siempre seria validarlo en Javascript, ya que evita recarga de paginas, pero como hacerlo asi seria inseguro, ya que javascript puede ser dehabilitado, entonces se valida tambien en PHP.

Pero eso no puede pasar en el caso de controlador modelo... el controlador no puede ser desabilitado, segun tu opinion dices que se debe validar en modelo y en controlador, siempre que se pueda, pero aun no acabo de entender que beneficios trae ese codigo repetido.

¿Que beneficios trae hacer las validaciones en controlador y modelo frente a hacer todas las validaciones en el controlador?
  #9 (permalink)  
Antiguo 14/01/2011, 12:55
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Validación en controller o en model?

Es por proceso, la idea de MVC es que tus modelos sean lo mas ricos e independientes separados de todo proceso para que puedas llamar a tus modelos ya sea desde el Controller y el flow MVC o desde fuera, en este caso que expongo, los procesos batch tienen un flujo independiente a MVC (ya que solo procesan información) por lo cual si la validación solo existiera en el controller, se brincaría esa información.

Es como comento depende de la aplicación, hay aplicación que usan validación inclusive a nivel de Stored Procedures en la base de datos para asegurarse que envías datos correctos, o sea la validación es a 3 niveles:
- GUI
- Service Layer
- Database

Al final la idea es que los datos fluyan de manera correcta desde la primera capa a la siguiente, es por eso que validar en los 3 lados no es del todo incorrecto.

Saludos.
  #10 (permalink)  
Antiguo 14/01/2011, 20:22
 
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 8
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Validación en controller o en model?

La verdad es que yo suelo validar en el modelo porque entiendo que es el responsable de su contenido. De hecho, la capa modelo contiene la lógica del negocio, así que tiene sentido que sea autosuficiente.

Esa capa modelo es compartida por distintos controllers (ya sean servicios web, scripts que corren en un cron, páginas web, ... ), y estos leen y pasan datos.

Creo que en RubyOnRails dentro del activeRecord se definen las reglas de validación, por ejemplo:

Código PHP:
class Nota ActiveRecord::Base 
    validates_presence_of 
:titulo, :intro, :texto  
    validates_length_of 
:titulo, :minimum => , :maximum => 120
        
validates_length_of :intro, :maximum => 250, :too_long => "Usted ingreso mas caracteres que los {{count}} permitidos" 
end 
Respecto a validar con javascript en el lado del cliente, suelo seguir este esquema:

formulario web -> (ajax, envío campos del formulario) -> controlador -> modelo (valida datos) -> controlador -> (json) -> formulario web

Lo que pasa es que como en todos los sitios veo la validación en el controlador, quería compartir mis dudas con otros programadores.

Validar en los controladores puede ser útil cuando implique a varios modelo a la vez, pero sigo teniendo mis dudas.

Para mí, lo ideal es tener una capa modelo robusta, con consistencia, que implemente toda la lógica del negocio sin necesidad de controladores ni vistas, y para que eso se cumpla debe poder autovalidarse.
  #11 (permalink)  
Antiguo 21/01/2011, 14:45
Avatar de CodeIgniter  
Fecha de Ingreso: enero-2011
Ubicación: $this->load->view('Rafaela', 'Argentina')
Mensajes: 44
Antigüedad: 13 años, 3 meses
Puntos: 14
Respuesta: Validación en controller o en model?

Que apasionante el software amigos !

Yo tenía como una certeza el hecho de que los controladores son el cerebro del equipo, es decir aquellos que toman las dediciones y manejan la lógica de nuestro sistema (por ejemplo, decidir si corresponde que el usuario ingrese al sistema, o no, según los datos que tipeo en el login).

Mientras que las vistas y modelos son asistentes del cerebro. Las vistas lo ayudan a tomar info proveniente del usuario y definir el formato de presentación de las salidas. Y los modelos lo ayudan a traer y llevar datos de la db.

Sin embargo, aquí me encuentro con otra gente que trabaja cuestiones de lógica en los modelos (capa datos) y también le da buenos resultados.

Brindo por el soft, por el mvc y la versatilidad que éste nos ofrece !

Saludos

Última edición por CodeIgniter; 21/01/2011 a las 14:51
  #12 (permalink)  
Antiguo 21/01/2011, 15:41
Avatar de SergeMedina  
Fecha de Ingreso: septiembre-2007
Ubicación: Guadalajara, Jalisco
Mensajes: 459
Antigüedad: 16 años, 7 meses
Puntos: 20
Respuesta: Validación en controller o en model?

De hecho la teoria del patrón MVC es que tu modelo sea la capa de negocio de tu aplicación. Y el controller solo se dedique a delegar que modelo hará el trabajo.

Hay algo que dicen: "Thin controller, fat model" y eso es una muy buena practica.

Saludos.
__________________
I see dead pixels

Etiquetas: controller, validar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:23.