[Ayuda] Ideas para Validacion

Iniciado por danny920825, 19 Junio 2017, 14:55 PM

0 Miembros y 1 Visitante están viendo este tema.

danny920825

Hola a todos. Estoy creando un sistema de validacion como parte del proceso de aprendizaje (ya se que los frameworks lo hace pero necesito saber como funciona). Para eso Tengo una carpeta llamada class dentro de mi proyecto donde obviamente guardo las clases y dentro una carpeta llamada Validations donde dentro las clases ValidationClass, isTextValidationClass y isNumerosValidationClass por el momento. Cada una de las clases se llama igual que el archivo. Pues la clase ValidationClass es la clase padre y el resto son hijas. El código de la clase ValidationClass es el siguiente:

Código (php) [Seleccionar]

<?php


/**
 * User: Dark_Stone
 * Date: 12/06/2017
 * Time: 23:50
 */
class ValidationClass
{
    protected static function 
canBeValidated($dato)
    {
        
/*
         * Este metodo devuelve false y la clase hija que se haga cargo entonces retornará true
         * Indicando que se puede hacer cargo de la validacion.
         * */
        
return false;
    }


    public static function 
validar($datos)
    {
        
//Instancia la clase
        
$validate = new ValidationClass();

        
//Obtener los hijos en un array
        
$childs $validate->getChilds();

        
//Recorrer el array buscando a ver quien puede validar el dato
        
foreach ($childs as $child) {

            if (
$child::canBeValidated($datos))
                return 
$child::validar($datos);

        }
    }



    private function 
getChilds()
    {
        
//Metodo para determinar los hijos

        /*Un array vacio para guardar los nombres de las clases que retornen true
        *  a la clase padre
        */
        
$array = array();
        
//Obtener la direccion de los archivos de validacion
        
$folder dir(getcwd() . "\\Validations");

        
//recorrer la carpeta buscando quien coincida con la clase
        
while (false !== ($entry $folder->read()))
            if (
$entry != '..' && $entry != '.' && $entry != 'ValidationClass.php') {
                include 
$entry//Incluimos cada archivo

                
$className str_replace('.php'''$entry);
                
$parents class_parents($className);
                
$ischildren false;
                foreach (
$parents as $campo => $valor)
                    if (
$valor == 'ValidationClass') {
                        
$ischildren true;
                        break;
                    }
                if (
$ischildren)
                    
$array[] = $className;

            }
        return 
$array;
    }


}


Y la clase isTextValidationClass por ejemplo, tiene el código de la siguiente forma (aun está en construccion)
Código (php) [Seleccionar]

<?php

/**
 * User: Dark_Stone
 * Date: 14/06/2017
 * Time: 17:53
 */
class isTextValidationClass extends ValidationClass
{

    protected static function 
canBeValidated($datos)
    {
        return 
is_string($datos);
    }


    public  static function 
validar($dato)
    {
        if(
is_string($dato))
        {
            return 
"Es un string"//Es un ejemplo de que hacer si es string
        
}
    }


}


Eso me permite hacer algo como esto
Código (php) [Seleccionar]

$datos = "Esto es un String" //Ejemplo de string
$validar = ValidationClass::validar($datos);
echo $validar;


Pero mi pregunta (ya era hora de que hiciera una despues de tanta explicacion) es: Como puedo validar en 2 métodos a la vez? o sea, saber por ejemplo si es string y si tiene mas de 15 caracteres? Usando 2 clases isTextValidationClass y MaxLengthValidationClass. Pense en pasarlo como parametros
Código (php) [Seleccionar]

$datos = "Esto es un String" //Ejemplo de string
$anotherValidation = "MaxLengthValidationClass";
$validar = ValidationClass::validar($datos,$anotherValidation);
echo $validar;

Pero no estoy seguro de cómo hacerlo. ¿Alguna idea por favor?
"Los que reniegan de Dios es por desesperación de no encontrarlo".
   Miguel de Unamuno

#!drvy

Yo creo que mejor seria que las clases tengan un método propio de validación y usen el general solo para devolver el resultado de dicha. De esta manera, podrías retornar $this en el propio validador y al final comprobar con una funcion (pj: isValid()) que todo esta correcto.

Código (php) [Seleccionar]
<?php


class Validador {
    protected 
$isValid true;
    protected 
$input null;

    public function 
setInput($input){
        
$this->input $input;
        return 
$this;
    }

    public function 
isValid(){
        return 
$this->isValid;
    }

    
/** FUNCIONES DE OTRAS CLASES ... **/
    
public function isString(){
        if(!
$this->isValid){ return $this; } // No nos molestamos ya que un validador previo ha dado falso
        
        
$this->isValid = (is_string($this->input));
        return 
$this;
    }


    public function 
hasLength($length){ 
        if(!
$this->isValid){ return $this; } // No nos molestamos ya que un validador previo ha dado falso
        
        
$this->isValid = (strlen($this->input) > $length);
        return 
$this;
    }
}

$test = new Validador();
var_dump($test->setInput('holakase')->isString()->hasLength(7)->isValid()); // true
var_dump($test->setInput(123)->isString()->isValid()); // false
var_dump($test->setInput('prueba123')->hasLength(50)->isString()->isValid()); // false


Por ejemplo.

Saludos

danny920825

Gracias. Ya veo que hay varias formas. Ahora mismo otra persona me estaba comentando que la idea es que cuando le pases un dato de un formulario, el solo sepa el tipo de validacion que debe aplicar (el objetivo es que sea generico) y me dijo que busque sobre la base de ReflectionClass para que lea los comentarios y esas cosas. Y hable con quien me esta enseñando y me dijo que lo hiciera por prioridad (Primero las validaciones secundarias y luego las principales). Creo que tendría que estudiar cada una de las opciones y escoger la que más general Sea. Gracias por la respuesta! Agradecido totalmente
"Los que reniegan de Dios es por desesperación de no encontrarlo".
   Miguel de Unamuno