2011-04-23 18 views
6

Tengo una función de validación que devuelve true o false.
Sin embargo, quiero que proporcione información como cuál es el problema, cuando hay uno.PHP - Función de validación para devolver true | false, Y un mensaje si es falso

Digamos que la función es la siguiente:

function is_valid($val) { 
    $result = true; 
    if(rule_1_not_met) $result = false; 
    if(rule_2_not_met) $result = false; 
    return $result; 
} 

que se utiliza como esto

$val = $_GET['some_param']; 
if(!is_valid($val)) $out .= 'Not so helpful feedback.'; 
... 

pensé que podría cambiar de esta manera:

function is_valid($val) { 
    $result = array(true, array()); 
    if(rule_1_not_met) $result[1][] = 'Reason 1'; 
    if(rule_2_not_met) $result[1][] = 'Reason 2'; 
    if(count($result[1]) > 0) $result[0] = false; 
    return $result; 
} 

y utilizarlo como este:

$val = $_GET['some_param']; 
$validation_result = is_valid($val); 
if(!$validation_result[0]) $out .= implode('<br/>', $validation_result[1]); 
... 

Mi pregunta es

  • estoy yo en, por resultados inesperados con esto?
  • ¿Hay mejores formas de lograr esto?

P.S. Haría que esta comunidad wiki

+0

no ve un vínculo para hacer de esta comunidad wiki. ¿Cómo se hace eso? –

+0

Puede marcarlo para la atención del moderador y escribir una breve nota. Pero esta no es una pregunta wiki de la comunidad. –

+0

@Felix Kling: Lo dije porque podría ser difícil no aceptar más de una respuesta. Esperará para ver qué viene. –

Respuesta

11

Usted está en el camino correcto, pero me gustaría hacer esto de esta manera

function is_valid($val,&$mes) { 
    $result = true; 
    if(rule_1_not_met) { $mes[]='message one'; $result = false; } 
    if(rule_2_not_met) { $mes[]='Message two'; $result = false; } 
    return $result; 
} 

$mes=array(); 
if(isvalid($val,$mes) ===false) $out .= implode('<br/>', $mes); 
+0

Esto tiene el beneficio de construir el mensaje incrementalmente a lo largo de varias llamadas a 'is_valid', que podría ser útil. –

+0

Gracias, esto ayuda con la depuración. – CrandellWS

1
$reasons = array(); 
function is_valid($val) 
{ 
    global $reasons; 
    if (rule_1_not_met) $reasons[] = 'Reason 1'; 
    if (rule_2_not_met) $reasons[] = 'Reason 2'; 
    if (count($reasons) == 0) 
     return TRUE; 
    else 
     return FALSE; 
} 

if (!is_valid($condition)) 
{ 
    echo 'Was not valid for these reasons<br />'; 
    foreach($reasons as $reason) 
     echo $reason, '<br>'; 
} 
else 
    echo 'Is valid!'; 
2

Se puede usar un objeto de resultado que encapsula los datos de retorno, un mensaje y una estado.

decir

class Result($bResult, $sMessage, $mData) { 
    public function __construct() { 
     $this->bResult = $bResult; 
     $this->sMessage = $sMessage; 
     $this->mData = $mData; 
    } 
} 

en el código:

$result = new Result(true, 'some helpful message here', null); 
+0

Me gusta lo que estás sugiriendo aquí ... pero no veo esto en la naturaleza muy a menudo, la sugerencia de @ Framework es lo que estoy acostumbrado a ver, ni siquiera pude encontrar un artículo o ejemplo que usara este enfoque ... ¿solo soy un Googletard hoy? ¿O hay otras personas usando su enfoque? –

+1

Hola @CamdenS. Supongo que es una solución bastante personalizada. Me inspiré en un ex colega que utilizaría esta estructura para mover datos. –

Cuestiones relacionadas