PHP类继承和数据验证

时间:2014-07-26 04:06:49

标签: php design-patterns

我有一些关于如何设计我的两个课程的问题,以便我避免"复制"并且"粘贴"代码以最大化可重用性。我有一个创建用户的类。实质上,它验证条目,然后在数据库中插入用户。另一方面,我有另一个类更新用户,但只有用户的一部分个人资料。这是我的第一堂课。

<?php
class newEmployee extends CoreConnect {

    protected $_info = array();
    protected $_errors = array();

    public function __construct($data) {
        parent::__construct();

        $this->_info = array(
            'firstname' => '',
            'lastname'  => '',
            'street'    => '',
            'postal-code'   => '',
            'province'      => '',
            'email'         => '',
            'country'       => '',
            'userUpdate'     => '',
            'wage'          => 0,
            'emp-status'    => '');

            $this->_info = $data + $this->_info;
    }


    protected function validate() {

        if($this->_info['firstname']=="" || $this->_info['lastname']==""){
            $this->_errors[] = "Employee's full name is required";
        }

        if(ctype_alpha ( $this->_info['firstname'].$this->_info['lastname'])==false) {
            $this->_errors[] = "Employee name is invalid";
        }

        if($this->_info['wage']!="") {
            if(!is_numeric($this->_info['wage'])) {
                $this->_errors[] = "Salary invalid";    
            }
        }

        if($this->_info['userUpdate']=="" && isset($this->_info['userUpdate'])) {
            $this->_errors[] = "User missing";
        }       

        if($this->_info['email']!="") {
            if (!filter_var($this->_info['email'], FILTER_VALIDATE_EMAIL)) {
                $this->_errors[] = "Email address is invalid";
            }
        }



    }   

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

    public function add(){
        $this->validate();
        if(empty($this->_errors)) {
            $params = array();
            $query = $this->_INSTANCE->pdo->prepare("INSERT INTO employees 
            (ID, firstname, lastname, email,  street, postal_code, province, country, employee_type, member_since) 

            VALUES (NULL, :firstname, :lastname, :email,  :street, :postal_code, :province, :country, :status, NOW())
                        ");
            $params[":firstname"]   = $this->_info["firstname"];
            $params[":lastname"]    = $this->_info["lastname"];
            $params[":street"]      = $this->_info["street"];
            $params[":email"]       = $this->_info["email"];
            $params[":postal_code"] = $this->_info["postal-code"];
            $params[":province"]    = $this->_info["province"];
            $params[":country"]     = $this->_info["country"];
            $params[":status"]      = $this->_info["emp-status"];

            return $query->execute($params);
        }
    }
}

这里validate方法验证了我希望验证的条目。更新用户的班级&#39;数据如下所示:

<?php
require_once 'class.newEmployee.php';
class updateEmployee extends newEmployee {

    public function __construct($data) {
        parent::__construct();

        $this->_info = array(
            'employeeID'    => "",
            'firstname' => '',
            'lastname'  => '',
            'email'     => '',
            'street'    => '',
            'postal-code'   => '',
            'province'      => '',
            'country'   => '');

            $this->_info = $data + $this->_info;
    }

    public function update(){
        $this->validate();


        if(empty($this->_errors)) {
            $params = array();
            $query = $this->_INSTANCE->pdo->prepare("UPDATE employees 
            SET 
                firstname=:firstname, 
                lastname=:lastname, 
                street = :street,
                postal_code = :postal_code,
                province = :province,
                email = :email,
                country  = :country
            WHERE ID = :ID ");

            $params[":ID"] = $this->_info["employeeID"];
            $params[":firstname"] = $this->_info["firstname"];
            $params[":lastname"] = $this->_info["lastname"];
            $params[":street"] = $this->_info["street"];
            $params[":postal_code"] = $this->_info["postal-code"];
            $params[":province"] = $this->_info["province"];
                $params[":email"] = $this->_info["email"];
            $params[":country"] = $this->_info["country"];


            return $query->execute($params);

        } else {
            return false;
        }   
    }
}

在这种情况下,我不仅要验证validate方法从newEmployee验证的内容,还要验证名为employeeID的新输入。基本上我想要实现的是能够以某种方式将父类的一部分用于子类并且还引入新的验证。为了添加另一个验证点,覆盖validate方法显然不方便。在创建新员工和更新员工时使用相同的验证是有意义的。在这种情况下,代码可重用性是必须的,因为无论是创建员工还是更新他/她的个人资料,它都必须是统一的。

任何建议或参考都会很棒......

1 个答案:

答案 0 :(得分:0)

我使用这个类进行验证,函数&#34; validar&#34;收到两个参数,第一个是要验证的数据,第二个是规则。

  <?php 
/**
* Esta clase valida todos los datos de entrada al servidor
*/
class Validador 
{

    public $errores = array();      


    /**
     * esta funcion valida las variables que vengan en el post y el get
     * dependiendo de las reglas recibidas
     */
    public function validar($datos, $reglas){

        $valido = TRUE;

        foreach ($reglas as $campo => $regla) {

            $verificadores = explode('|', $regla);

            foreach ($verificadores as $verificador) {
                $valor = isset($datos[$campo]) ? $datos[$campo] : NULL;
                if( !$this->$verificador($valor, $campo) ){
                    $valido = FALSE;
                }
            }

        }
        return $valido; 
    }

    /**
     * valida que un valor sea un email valido
     */
    private function email($valor, $campo){
        $valido = filter_var($valor, FILTER_VALIDATE_EMAIL);
        if(!$valido){
            $this->errores[] = "El campo ".$campo." necesita un email valido";              
        }
        return $valido;
    }

    /**
     * verifica que un valor no este vacio
     */
    private function requerido($valor, $campo){
        $valido = !empty($valor);
        if(!$valido){
            $this->errores[] = "El campo ".$campo." es requerido";              
        }
        return $valido;
    }

    /**
     * comprueba que un rut sea valido
     */
    private function rut($valor, $campo){
        //return TRUE;
        $dv = substr($valor, -1);
        $rut = substr($valor, 1,-3);

        $s=1;
        for($m=0;$valor!=0;$valor/=10)
            $s=($s+$valor%10*(9-$m++%6))%11;

        $valido = chr($s?$s+47:75) == $dv;
        if(!$valido){
            $this->errores[] = "El campo ".$campo." necesita un rut valido";                
        }
        return $valido;
    }

    /**
     * verifica que el token recibido sea igual al de la sesion activa
     */
    private function token($valor, $campo){
        $valido = $valor == $_SESSION['token'];
        if(!$valido){
            $this->errores[] = "El campo ".$campo." necesita un token valido";              
        }
        return $valido;
    }

    /**
     * verifica si el valor recibido es numerico
     */
    private function numero($valor, $campo){
        $valido = is_numeric($valor);
        if(!$valido){
            $this->errores[] = "El campo ".$campo." necesita un numero valido";             
        }
        return $valido;
    }

    /**
     * verifica si el valor recibido es texto
     */
    private function texto($valor, $campo){
        $valido = is_string($valor);
        if(!$valido){
            $this->errores[] = "El campo ".$campo." necesita un texto valido";              
        }
        return $valido;
    }

    /** 
    *   verifica si el valor recibido es un array
    **/
    private function arreglo($valor, $campo){
        $valido = is_array($valor);
        if(!$valido){
            $this->errores[] = "El campo ".$campo." necesita un arreglo valido";                
        }
        return $valido;
    }

    /** 
    *   verifica si el valor recibido es un array
    **/
    private function fecha($valor, $campo){
        $pattern = '/\d{2}-\d{2}-\d{4}/'; // regex para fecha formato: DD-MM-AAAA ej: 17-07-2014

        $valido = preg_match($pattern, $valor);
        if(!$valido){
            $this->errores[] = "El campo ".$campo." necesita una fecha valida ej: 14-04-2014";              
        }
        return $valido;
    }
}

&GT;

我用这种方式打电话:

 $reglas = array(
                'nombre' => 'requerido',
                'descripcion' => 'requerido',
                'token' => 'token|requerido'
                );
 $validador = new Validador();
 if ($validador->validar($_POST, $reglas)) {                        
    //valid data                        
 }else{
    // invalid data
 }