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

Validación valores seteados en una clase

Estas en el tema de Validación valores seteados en una clase en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola buenas, Quisiera saber cual es la mejor manera para validar los datos que se le pasan a una clase... yo para cada "modulo" de ...
  #1 (permalink)  
Antiguo 19/05/2011, 02:34
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Validación valores seteados en una clase

Hola buenas,

Quisiera saber cual es la mejor manera para validar los datos que se le pasan a una clase... yo para cada "modulo" de mi aplicación defino sus clases y sus modelos, pero no se si la validación de los valores que se le pasan a estos, debe de estar dentro, fuera, o dentro y fuera de la clase.. por ejemplo:

$miclase = new Coche();

$coche->setPuertas(5);

el método setPuertas, tendría que validar que se le pasa un número entero? o yo tengo que hacer una validación antes de que le llegue el dato por otra parte?

Un saludo y gracias!!
  #2 (permalink)  
Antiguo 19/05/2011, 05:09
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Validación valores seteados en una clase

Podrías hacerlo dentro del método de setPuertas.
Código PHP:
Ver original
  1. <?php
  2. class FooBar
  3. {
  4.     private $_foo;
  5.  
  6.     public function setFoo($foo)
  7.     {
  8.         $this->_foo = (int)$foo;
  9.     }
  10. }

Algunos indican que los setter y getters solo deberían ser mostrar o guardar datos y que con otros métodos sea que hagas las validaciones. Es decir
Código PHP:
Ver original
  1. <?php
  2. class FooBar
  3. {
  4.     private $_foo;
  5.  
  6.     public function setFoo($foo)
  7.     {
  8.         $this->_foo = $foo;
  9.     }
  10.  
  11.     public function bar()
  12.     {
  13.         $bar = (int)$this->_foo;
  14.         return $bar;
  15.     }
  16. }
Una de las muchas razones que posiblemente quieras guardar en esa variable, diferentes tipos de datos y en los métodos que quieras usar puedes especificar. Pero eso es a discreción tuya.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 19/05/2011, 05:20
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 valores seteados en una clase

Sigue este thread http://www.forosdelweb.com/f68/duda-...to-mvc-893946/

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #4 (permalink)  
Antiguo 19/05/2011, 06:03
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Respuesta: Validación valores seteados en una clase

Muy buena la información.. pero no me queda del todo claro... jajaja

Yo tengo por una parte, los modelos, por otra, las clases con los objetos de mi aplicación, (usuarios, etc), y por otra los controladores. Mi idea, es que, al hacer un set en el objeto, se valide ( pero sin tener en cuenta el tipo de error ) el contenido que recibe, por ejemplo:

Código PHP:
class Coche {

 private 
$__puertas;

 public function 
setPuertas($puertas) {
  if(
is_numeric($puertas)) {
     
$this->__puertas $puertas;
   }
 }


Es decir, al menos el tipo de dato, con filter_var o lo que sea.

Y luego, en mis modelos, controlar de una manera más detallada todo lo demás..

Un saludo!
  #5 (permalink)  
Antiguo 19/05/2011, 06:29
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Validación valores seteados en una clase

Lo recomendable es ingresar el valor en el set no importando que tipo de datos sea y luego las validaciones en otro método.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #6 (permalink)  
Antiguo 19/05/2011, 06:36
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Respuesta: Validación valores seteados en una clase

Hola buenas de nuevo,

Entonces, tengo que crear un método asociado a cada setter que valide el dato? ... pero, entonces cuando setee un dato, no llamaré al set, si no al nuevo método? que lío...

Un saludo!
  #7 (permalink)  
Antiguo 19/05/2011, 06:38
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Validación valores seteados en una clase

Pasa por el enlace que te indicó master para que veas lo que puedes hacer.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #8 (permalink)  
Antiguo 19/05/2011, 06:39
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Respuesta: Validación valores seteados en una clase

De acuerdo, pero algún ejemplo básico?

Un saludo!
  #9 (permalink)  
Antiguo 19/05/2011, 08:25
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 valores seteados en una clase

De hecho a mi parecer es el mismo método setter el que debe de validar que tipo de dato, por ejemplo en Zend Framework cuando llaman al set, hace la validación por ejemplo:
Código PHP:
Ver original
  1. public function setRequest($request)
  2.     {
  3.         if (is_string($request)) {
  4.             if (!class_exists($request)) {
  5.                 require_once 'Zend/Loader.php';
  6.                 Zend_Loader::loadClass($request);
  7.             }
  8.             $request = new $request();
  9.         }
  10.         if (!$request instanceof Zend_Controller_Request_Abstract) {
  11.             require_once 'Zend/Controller/Exception.php';
  12.             throw new Zend_Controller_Exception('Invalid request class');
  13.         }
  14.  
  15.         $this->_request = $request;
  16.  
  17.         return $this;
  18.     }

La idea es que el setter mismo valide que tipo de datos tenga para que la clase sea consistente.

Saludos.
  #10 (permalink)  
Antiguo 19/05/2011, 08:45
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Validación valores seteados en una clase

Cita:
Iniciado por GatorV Ver Mensaje
De hecho a mi parecer es el mismo método setter el que debe de validar que tipo de dato, por ejemplo en Zend Framework cuando llaman al set, hace la validación por ejemplo:
Código PHP:
Ver original
  1. public function setRequest($request)
  2.     {
  3.         if (is_string($request)) {
  4.             if (!class_exists($request)) {
  5.                 require_once 'Zend/Loader.php';
  6.                 Zend_Loader::loadClass($request);
  7.             }
  8.             $request = new $request();
  9.         }
  10.         if (!$request instanceof Zend_Controller_Request_Abstract) {
  11.             require_once 'Zend/Controller/Exception.php';
  12.             throw new Zend_Controller_Exception('Invalid request class');
  13.         }
  14.  
  15.         $this->_request = $request;
  16.  
  17.         return $this;
  18.     }

La idea es que el setter mismo valide que tipo de datos tenga para que la clase sea consistente.

Saludos.
Interesante, muchas de las lectuas lo que indican es que los setters y getters solo deben ser para el propósito de asignar y leer, por cuestiones de encapsulamiento a las propiedades. Las validaciones se hacen por otro lado. Siempre he tenido la duda si hacerlo en el setter por cuestión de eliminar procesos adicionales. Pero ya veo que hay diferencias en el estilo de programar.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #11 (permalink)  
Antiguo 19/05/2011, 09:25
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 valores seteados en una clase

Nunca había visto eso que tú comentas, de hecho casí todos los programas que he visto (inclusive en otros lenguajes) el setter mismo valida el tipo de dato que va a recibir.
  #12 (permalink)  
Antiguo 19/05/2011, 09:44
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 20 años, 11 meses
Puntos: 60
Respuesta: Validación valores seteados en una clase

Cita:
Iniciado por abimaelrc Ver Mensaje
Interesante, muchas de las lectuas lo que indican es que los setters y getters solo deben ser para el propósito de asignar y leer, por cuestiones de encapsulamiento a las propiedades. .
No tendría entonces sentido tener setters y getter ya que en ese caso pues mejor variables publicas ya que el setter y el getter no harían NADA, el setter y el getter son metodos especiales para NO acceder directamente a la propiedad SINO poder darle algo de logica a la setteo y al getteo.

Vamos, pensemoslo si vamos a "hacer un setter" debe de ser como un "Cadenero" en la entrada de un antro el decide si entran vestidos con tennis o NO.. Sería un poco "ilogico" dejarlos entrar y después adentro decidir cuales vienen vestidos con tennis y cuales NO.
__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador
  #13 (permalink)  
Antiguo 19/05/2011, 09:54
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Validación valores seteados en una clase

Ok, pues corregido en mi mente el que se puede hacer con los setter. Pero no sé si mal-interprete por ejemplo: http://phpsenior.blogspot.com/2006/1...accesores.html
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #14 (permalink)  
Antiguo 19/05/2011, 10:11
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 valores seteados en una clase

Como dice el link, hay diferentes niveles, no le puedes agregar toda la lógica al setter, aunque es posible validar el tipo de dato, ahora sí que es a requerimiento, si tu objeto realmente por ejemplo no puede tener el mismo nombre que ninguno, y es elemental, si agrega el set del nombre ahí, todo depende del requerimiento del objeto, pero no tiene ningún problema que el mismo objeto valide que tipo de dato necesita.

El ejemplo de _ssx es muy bueno en este punto, para que dejas entrar datos que no necesitas a tu objeto si desde el set puedes revisar que sea un tipo de dato correcto (que sea usable o no lo puedes dejar para una validacion posterior).

Por ejemplo continuando lo que dice _ssx, puedes dejar pasar al antro a quien no tiene tenis, pero ya dentro del antro verificas que tenga dinero, ya que solo te interesa usuarios que no tengan tenis, lo demas ya lo dejas a la implementacion posterior a la hora de pagar().

Saludos.
  #15 (permalink)  
Antiguo 19/05/2011, 13:28
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Validación valores seteados en una clase

Gracias por el dato, ahora si que estoy plenamente convencido
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #16 (permalink)  
Antiguo 19/05/2011, 14:01
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Respuesta: Validación valores seteados en una clase

Perfecto.. ahora yo también lo veo más claro... mi lógica decía que tenía que implementar una cierta lógica.. ( valga la redundancia ) , por ejemplo, no me parecia bien que el setter de un numero pudiera comerse una string, y por eso decidí que, aunque no se hiciera así, debía de implementar al menos un nivel básico de validación para que almenos el set tubiera sentido, después de comprobar tras vuestros comentarios que es bueno hacer eso, me alegro mucho de ir por el buen caminoo0o!! jaja MUCHAS GRACIAS!

Un saludo!
  #17 (permalink)  
Antiguo 19/05/2011, 18:05
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años
Puntos: 461
Respuesta: Validación valores seteados en una clase

Interesante, tenia la misma idea que platea abimaelrc, de echo en algunos ejemplos (veamos si consigo los link) hacen el setter y luego hacen la validacion, no habia caido en que se puede hacer una validacion directa en este mismo , bueno todos los dias se aprende algo, con respecto al tema que te indico el amigo masterpuppet es una clase super sencilla para hacer validaciones, en mi caso y no se si esta bien implementado las hago directamente en los modelos al momento de aplicar la lógica de la aplicacion, pero viendo bien lo que indican aca creo que tengo que mejorar un poco los setter que tengo en mis clases , saludos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way

Etiquetas: clase, zend, 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 14:37.