Bonjour, ses encore moi... J'aimerais savoir votre "point de vue", sur la validation des données postées par l'utilisateur.

En effet, j'aimerais comprendre comment fonctionne le système de validation de Cakephp qui est aussi disponible hors du coeur de l'application Cakephp...

Je m'explique, imaginons un espace membre, simple et basique, deux pages une pour la connexion, l'autre pour l'inscription.

On va y retrouver donc deux champs similaires, par exemple : Pseudonyme, et Mot de passe, dans mon cas je ne veux pas que ses champs soient vides alors je fais un

$validator = new Validator();
$validator->notEmpty('pseudonyme')->notEmpty('password');

Jusque-là vous allez me dire... rien de nouveau mais pour ma seconde page... Je vais répéter ce code !

Et l'idée de me répéter me plaît pas trop, j'aimerais donc savoir s'il serait possible de faire une classe qui "analyse" les données postés, et qui les compares suivant le champ envoyé.

Je m'explique avec un petit exemple.

UserValidator.php :

<?php
use Cake\Validation\Validator;

Class UserValidator extends Validator {
    private $datas = [];

    public function __construct(array $datas = []) {
        parent::__construct();
        $this->datas = $datas;
    }

    public function _postPseudonyme() {
        $this->notEmpty($this->data['pseudonyme']);
    }

    public function _postPassword() {
        $this->notEmpty($this->data['password']);
    }
}

Connexion.php

<?php 
$validator = new UserValidator($_POST);
if(!empty($validator->errors($_POST))) {
    die('Des erreurs sont survenu');
} else {
    die('Très bien, tout est remplie!');
}

Le principe et en fait simple d'apparence pour mon cerveau, mais je ne sais pas comment je pourrais faire afin de rendre cela propre et surtout "automatique", car si j'ai _postEmail(); mais que celui-ci n'est valide que sur la page inscription, alors notre classe le devinera grâce aux données postées (si John doe à poster email alors on vérifie, sinon ont ne fait rien).

Voilà, je pense avoir été assez claire sur ma question, en espérant que vous avez réussi à me comprendre.

Merci.

5 réponses


PhiSyX
Réponse acceptée

Faut passer en param les données à $validator->errors($_POST). ^^
-> https://dl.dropboxusercontent.com/u/33523942/examples/forum/grafikart/19932.php

Crée une classe Validator qui étend de la classe (use Cake\Validation\Validator as BaseValidator;).
Crée les méthodes de validations, dans ton cas toutes les méthodes qui sont préfixées par _post et ajoute y les règles générales.
Dans le constructeur, parcours les données du tableau $_POST, vérifie si la méthode _post{$key} existe et si c'est l'cas, t'éxècutes cette dernière.
Tu peux aussi créer une classe UserValidator qui elle étend de ta classe Validator, puis de recréer les méthodes (pas obligatoire si celles par défaut te conviennent) pour ajouter ou modifier les règles par rapport à ton app users. ^^

Voilà, je pense que c'est ce que tu veux? :c

Bonsoir, ses exactement ce que je pensais, j'avoue au début je ne savais pas vraiment comment faire le _post{$k}, bien que j'ai réussi, le système ne fait plus de "vérification", ou ne stocke pas les erreurs.

Voici les codes (En brouillon) :

<?php
use Cake\Validation\Validator as BaseValidator;

Class Validator extends BaseValidator {
    private $datas = [];

    public function __construct(array $datas = []) {
        $this->datas = $datas;

        if(!empty($this->datas)) {
            foreach($this->datas as $k => $v) {
                $k = ucfirst($k);
                $class = "_post{$k}";
                $current = get_class($this);

                if(method_exists($current, $class)) {
                    $func = new $current();
                    return $func->$class($v);
                } else {
                    return false;
                }
            }
        }
    }
}

UserValidator.php

<?php
Class UserValidator extends Validator {
    protected function _postEmail() {
        return $this
            ->notEmpty('email');
    }

    protected function _postPassword() {
        return $this
            ->notEmpty('password');
    }
}

Tableau (UserValidator) :

object(UserValidator)[36]
  private 'datas' (Validator) => 
    array (size=2)
      'email' => string 'xen0ris@outlook.fr' (length=18)
      'password' => string '' (length=0)
  protected '_fields' => 
    array (size=0)
      empty
  protected '_providers' => 
    array (size=0)
      empty
  protected '_presenceMessages' => 
    array (size=0)
      empty
  protected '_useI18n' => boolean false
  protected '_allowEmptyMessages' => 
    array (size=0)
      empty

Tableau (UserValidator->errors()) :

array (size=0)
  empty

EDIT avec un call_user_func_array([get_class($this), "_post{$k}"], $datas); cela marche hors une jolie erreur me dit : Strict standards: call_user_func_array() expects parameter 1 to be a valid callback, non-static method.. J'ai du mal à comprendre sur ce coup ^o^

Dans le cas d'un :
$class = get_class($this);
$class = new $class;

call_user_func_array([$class, "_post{$k}"], $datas);

Validator ne renvois plus d'erreurs...

Bonsoir, effectivement cela marche mieux ^^
Merci infiniment !