2009-10-29 6 views
6

Je travaille actuellement sur une application PHP OO. J'ai une classe appelée validation que je voudrais utiliser pour vérifier toutes les données soumises est valide, mais j'ai évidemment besoin d'un endroit pour définir les règles pour chaque propriété à vérifier. En ce moment, j'utilise des tableaux lors de la construction d'un nouvel objet. par exemple:Validation d'objet PHP

$this->name = array(
'maxlength' => 10, 
'minlength' => 2, 
'required' => true, 
'value' => $namefromparameter 
) 

Un tableau pour chaque propriété.

J'appellerais alors une méthode statique de la classe de validation qui effectuerait divers contrôles en fonction des valeurs définies dans chaque tableau.

Existe-t-il un moyen plus efficace de le faire? Un conseil apprécié. Merci.

Répondre

8

Je sais que le tableau associatif est couramment utilisé pour configurer les choses en PHP (il est appelé magic container modèle et est considéré comme une mauvaise pratique, d'ailleurs), mais pourquoi ne pas vous créer plusieurs classes de validateurs au lieu, chacun capable de gérer un règle? Quelque chose comme ceci:

interface IValidator { 
    public function validate($value); 
} 

$validators[] = new StringLengthValidator(2, 10); 
$validators[] = new NotNollValidator(); 
$validators[] = new UsernameDoesNotExistValidator(); 

Cela a plusieurs avantages par rapport à la mise en œuvre à l'aide des tableaux:

  • Vous pouvez documents les (très important), phpdoc ne peut pas analyser les commentaires pour les clés du tableau.
  • Votre code devient typo-safe (array('reqiured' => true))
  • Il est entièrement OO et ne présente pas de nouveaux concepts
  • Il est plus facile à lire (bien que beaucoup plus bavard)
  • La mise en œuvre de chaque contrainte peut être trouvé intuitivement (ce n'est pas en fonction de 400 lignes, mais dans la classe appropriée)

EDIT: Voici un link to an answer I gave à un different question, mais qui est surtout applicable à celui-ci aussi.

+0

Bon point avec la documentation! –

+0

Merci, je n'avais pas entendu parler d'interfaces avant. Je vais les vérifier! – Dan

0

Depuis l'utilisation de OO, il serait plus propre si vous utilisiez des classes pour valider des propriétés. Par exemple. Utiliser une classe a l'avantage d'encapsuler une logique à l'intérieur de celle-ci que le tableau (fondamentalement une structure) n'a pas.

0

Peut-être laissez-vous inspirer par Zend-Framework Validation.

donc définir un maître:

class BaseValidator { 
    protected $msgs = array(); 
    protected $params = array();  

    abstract function isValid($value); 
    public function __CONSTRUCT($_params) { 
     $this->params = $_params; 
    } 
    public function getMessages() { 
     // returns errors-messages 
     return $this->msgs; 
    } 
} 

Et puis construire votre validateurs sur mesure:

class EmailValidator extends BaseValidator { 
    public function isValid($val=null) { 
     // if no value set use the params['value'] 
     if ($val==null) { 
      $val = $this->params['value']; 
     } 
     // validate the value 
     if (strlen($val) < $this->params['maxlength']) { 
      $this->msgs[] = 'Length too short'; 
     } 
     return count($this->msgs) > 0 ? false : true; 
    } 
} 

Enfin votre tableau inital pourrait devenir quelque chose comme:

$this->name = new EmailValidator(
     array(
      'maxlength' => 10, 
      'minlength' => 2, 
      'required' => true, 
      'value' => $namefromparameter, 
     ), 
    ), 
); 

validation pourrait alors être fait comme ceci:

if ($this->name->isValid()) { 
    echo 'everything fine'; 
} else { 
    echo 'Error: '.implode('<br/>', $this->name->getMessages()); 
}