Qu'est-ce qu'un moyen efficace de gérer la validation des données, par exemple, à partir d'une soumission de formulaire?Effective Data Validation
À l'origine, j'avais un tas de if
instructions qui vérifiaient chaque valeur et collectaient des valeurs non valides dans un tableau pour une récupération ultérieure (et une liste).
// Store errors here
$errors = array();
// Hypothetical check if a string is alphanumeric
if (!preg_match('/^[a-z\d]+$/i', $fieldvalue))
{
$errors[$fieldname] = 'Please only use letters and numbers for your street address';
}
// etc...
Ce que je faisais à côté était créer une classe qui gère les différents scénarios de validation de données et stocker les résultats dans un tableau interne. Après la validation des données est complète, je vérifie pour voir si des erreurs se sont produites et des comportements appropriés:
class Validation
{
private $errorList = array();
public function isAlphaNumeric($string, $field, $msg = '')
{
if (!preg_match('/^[a-z\d]+$/i', $string))
{
$this->errorList[$field] = $msg;
}
}
// more methods here
public function creditCard($cardNumber, $field, $msg = '')
{
// Validate credit card number
}
// more methods here
public function hasErrors()
{
return count($this->errorList);
}
}
/* Client code */
$validate = new Validation();
$validate->isAlphaNumeric($fieldvalue1, $fieldname1, 'Please only use letters and numbers for your street address');
$validate->creditCard($fieldvalue2, $fieldname2, 'Please enter a valid credit card number');
if ($validate->hasErrors())
{
// Handle as appropriate
}
Naturellement, il n'a pas fallu longtemps avant que cette classe est devenue pléthorique avec les types quasi illimitées de données à valider. Ce que je fais maintenant utilise décorateurs pour séparer les différents types de données dans leurs propres classes et les appeler uniquement en cas de besoin en laissant les validations génériques (c.-à-isAlphaNumeric()) dans la classe de base:
class Validation
{
private $errorList = array();
public function isAlphaNumeric($string, $field, $msg = '')
{
if (!preg_match('/^[a-z\d]+$/i', $string))
{
$this->errorList[$field] = $msg;
}
}
// more generic methods here
public function setError($field, $msg = '')
{
$this->errorList[$field] = $msg;
}
public function hasErrors()
{
return count($this->errorList);
}
}
class ValidationCreditCard
{
protected $validate;
public function __construct(Validation $validate)
{
$this->validate = $validate;
}
public function creditCard($cardNumber, $field, $msg = '')
{
// Do validation
// ...
// if there is an error
$this->validate->setError($field, $msg);
}
// more methods here
}
/* Client code */
$validate = new Validation();
$validate->isAlphaNumeric($fieldvalue, $fieldname, 'Please only use letters and numbers for your street address');
$validateCC = new ValidationCreditCard($validate);
$validateCC->creditCard($fieldvalue2, $fieldname2, 'Please enter a valid credit card number');
if ($validate->hasErrors())
{
// Handle as appropriate
}
Suis-je sur la bonne piste? Ou ai-je compliqué la validation des données plus que nécessaire?
I utilise également la même façon que vous avez décrite dans le dernier. Je serais également intéressé à obtenir la réponse de ce Ques. Currenlty aussi je valide un formulaire. J'utilise TryParse et d'autres fonctions inbuild jusqu'à ce que ce soit possible. Restant je me crée. –