Page 1 sur 1

[ZF] Zend_Filter -> WhiteList

Posté : 18 juin 2011, 17:23
par Moosh
Pensez vous que ce soit une bonne idée ?

En gros je veux faciliter le travail des développeurs à la mise en place d'un peu plus de filtres dans les inputs.

Les listes blanches sont bien sécurisante car très contraignantes/strictes.

En fait ce qui m'étonne surtout c'est que ce soit si simple , et que ca n'existe pas.
Peut-être que j'oublie un truc
require_once ('Zend/Filter.php');

class My_Filter extends Zend_Filter
{
    function isInWhiteList ($value, $arrWhiteList, $blnStrict=false, $toReturnIfNotValid = null)
    {
        if (! is_array($arrWhiteList))
            throw new Exception(
            'isInWhiteList need an array in second parameter whiteList');
        if (in_array($value, $arrWhiteList,$blnStrict))
            return $value;
        return $toReturnIfNotValid;
    }
}

Re: [ZF] Zend_Filter -> WhiteList

Posté : 18 juin 2011, 17:41
par epommate2
Rien à voir avec ma question, mais pour ma culture personnelle, c'est quoi l'intérêt de Zend_Filter ?
function is_in_list($value,array $white_list,$default = false){
	return in_array($value,$white_list))?$value:$default;
}

Re: [ZF] Zend_Filter -> WhiteList

Posté : 18 juin 2011, 18:22
par Moosh
Je lis ta question de 2 manières.
  • A quoi sert Zend_Filter en général ?
  • Pourquoi vouloir utiliser Zend_Filter dans ce cas ?
Pour la la première je dirais,
Ca sert à filtrer :)

Ca sert à normaliser des méthodes du style, donne moi n'importe quoi et je te retourne une valeur acceptable.

Zend_Validate est une autre approche.
Ca sert à normaliser des méthodes du style, donne moi n'importe quoi et je te dirais si c'est une valeur acceptable.


Pour la 2eme, l'idée c'est juste de forcer l'utilisation de cette normalisation par le reste de l'équipe.

Re: [ZF] Zend_Filter -> WhiteList

Posté : 20 juin 2011, 14:06
par Moosh
La réponse à ma question se trouve dans Zend_Filter_Input. Je viendrai raconter ça quand j'aurai tout digéré.

Re: [ZF] Zend_Filter -> WhiteList

Posté : 20 juin 2011, 21:42
par Moosh
Bon , ben non, Zend_Filter_Input, bien que très intéressant (et tout aussi indigeste), ne réponds pas à mon besoin.

J'ai fait 2 tests http://trac.xp-dev.com/ZF_Experiences/b ... end_Filter


Mais la conclusion est bien celle que j'ai lu dans la doc.
$validators['couleur'] = array( array( 'InArray'
                                     , array( 'bleu'
                                            , 'vert'
                                            , 'blanc'
                                            , 'noir'
                                            )
                                     )
                              , Zend_Filter_Input::DEFAULT_VALUE => 'blanc'
                              );
$box = new Zend_Filter_Input(null, $validators);

ce validateur ne retourne rien si je donne un array('couleur' => 'jaune');

Par contre il retourne la Zend_Filter_Input::DEFAULT_VALUE (blanc ) si je donne un array sans 'couleur'.


Donc le comportement 'valeur de remplacement si validation échoue' n'existe pas nativement (ou je ne l'ai pas encore trouvée.)

Re: [ZF] Zend_Filter -> WhiteList

Posté : 21 juin 2011, 01:55
par devlop78
Non mais ce qui est dingue avec ce framework (que je respecte pas mal en partie), c'est justement la faible implémentation des filtres, des validateurs, etc.

Au final, tu prends un framework pour coder vite et tu passes ton temps à étendre les classes. Donc, il est tout à fait possible que tu aies créé un truc qui devrait exister et qui n'est pas présent ....

Ca me rappelle le validateur pour vérifier que deux champs d'un formulaire sont pareils (typiquement, deux champs de mots de passe) ... Il a fallu le chercher sur le Net :)

Re: [ZF] Zend_Filter -> WhiteList

Posté : 21 juin 2011, 05:17
par epommate2
$validators['couleur'] = array( array( 'InArray'
                                     , array( 'bleu'
                                            , 'vert'
                                            , 'blanc'
                                            , 'noir'
                                            )
                                     )
                              , Zend_Filter_Input::DEFAULT_VALUE => 'blanc'
                              );
$box = new Zend_Filter_Input(null, $validators);
Personnellement (pas taper), je trouve ca long, moche et surtout, il faut comprendre et apprendre le comportement de Zend_Filter_Input...
Et visiblement, ca n'a pas l'air d'avoir le comportement que l'on pourrait penser (retourner la valeur par défaut en cas de valeur pas dans la liste).

Tandis que
in_array($value,array('bleu','vert','blanc','noir)) ? $value : 'blanc';
est nettement plus compréhensible en utilisant deux opérateur de base (?: et array), ainsi qu'une fonction (de base aussi) sur les tableaux (in_array)

D'où ma première question : sachant que c'est beaucoup plus simple de NE PAS utiliser le ZF, il doit y avoir un énorme intérêt à l'utiliser.
l'idée c'est juste de forcer l'utilisation de cette normalisation par le reste de l'équipe.
Alors, si je comprend bien, on va essayer en utilisant des trucs vachement compliqués que les développeurs deviennent bon ? :-)

Re: [ZF] Zend_Filter -> WhiteList

Posté : 21 juin 2011, 16:47
par Moosh
$validators['couleur'] = array( array( 'InArray'
                                     , array( 'bleu'
                                            , 'vert'
                                            , 'blanc'
                                            , 'noir'
                                            )
                                     )
                              , Zend_Filter_Input::DEFAULT_VALUE => 'blanc'
                              );
$box = new Zend_Filter_Input(null, $validators);
Personnellement (pas taper), je trouve ca long, moche et surtout, il faut comprendre et apprendre le comportement de Zend_Filter_Input...
Et visiblement, ca n'a pas l'air d'avoir le comportement que l'on pourrait penser (retourner la valeur par défaut en cas de valeur pas dans la liste).
2 choses
1° Il a bien le comportement annoncé par la doc. Et moi j'ai un autre besoin. Je tente de faire entrer une responsabilité supplémentaire dans le code qui est de me fournir une valeur valide.

En fait ca n'existe pas dans Zend_Framework.

Il y a Zend_Validate_InArray qui vérifie et retourne un boolean.

Il y a Zend_Filter_Input qui sert a agglomérer des filtres et des validateurs ce qui permet de faire une boite noire, et on lui passe un tableau a valider.

Ce dont j'avais besoin c'est un Zend_Filter_InArray C'est ce que j'ai donc créé.

Zend_Filter_Input permet de donner une valeur par défaut et et Zend_Validate_InArray n'a pas une valeur de fallback

C'est à dire qu'il a une valeur en réserve si on ne donne pas de valeur, mais il n'a pas de valeur de remplacement si Zend_Validate_InArray retourne false

2° la complexité bien que notable a une raison.
Elle permet une notation plus verbeuse, parsable. C'est a dire que les filtres viennt ici dans l'exemple d'un array. Mais cet arrait pourrait venir d'une config, en ini, en db, en yaml .... Donc on peut créer un outil de génération de filtre ...
En outre Zend_Filter_Input est un peu une rustine pour ceux qui veulent utiliser des briques de Zend_Framework mais sans utiliser le mvc/application/zend_form...

Tandis que
in_array($value,array('bleu','vert','blanc','noir)) ? $value : 'blanc';
est nettement plus compréhensible en utilisant deux opérateur de base (?: et array), ainsi qu'une fonction (de base aussi) sur les tableaux (in_array)
C'est c'est en effet la version de base qu'on retrouve dans ma fonction de mon premier post.
Mais je ne veux pas de ça dans mes contrôleurs.

Quand on a 15 valeurs en entrées dans 25 contrôleurs je ne trouve plus ca aussi "compréhensible"
D'où ma première question : sachant que c'est beaucoup plus simple de NE PAS utiliser le ZF, il doit y avoir un énorme intérêt à l'utiliser.
l'idée c'est juste de forcer l'utilisation de cette normalisation par le reste de l'équipe.
Alors, si je comprend bien, on va essayer en utilisant des trucs vachement compliqués que les développeurs deviennent bon ? :-)
Rien à voir. C'est en isolant les responsabilités qu'on les contrôle mieux.

L'objectif est bien au final de créer des validateurs et filtres maisons ayant une sémantique forte et proche des ressources qu'on utilise, développée une fois pour toute et que les développeurs n'aie qu'a l'appeler quand on leur demande de travaille avec une telle donnée.

C'est à dire
si un développeur doit faire un script qui accepte en entrée un légume, il doit pouvoir ajouter un My_Filter_Legume($monPanierDuMarché)
Ce n'est pas à lui a re définir les critères. Ils sont définis et vérifié par une boite noire donc la création a été la responsabilité d'un autre.



Donc ma conclusion, c'est ce qui existe c'est déjà bien, mais ca ne réponds pas à un besoin que j'ai et qui ne trouve pas encore de réponse dans le framework.

Re: [ZF] Zend_Filter -> WhiteList

Posté : 21 juin 2011, 17:47
par epommate2
ok, merci pour ta réponse détaillée.

Juste un point :
Quand on a 15 valeurs en entrées
Alors, personnellement, quand un script (un contrôleur) récupère 15 variables en entrée, je trouve que c'est suspicieux, dans le sens ou je cherche plutôt à voir s'il n'y aurait pas un problème d'IHM ou de conception...

Re: [ZF] Zend_Filter -> WhiteList

Posté : 22 juin 2011, 17:01
par devlop78
Je n'ai pas tout lu mais la démarche de Moosh ne me semble pas suspect. Après tout, sa question ne se porte pas sur l'utilisation ou non d'un framework mais bel et bien du développement d'un Filtre, ce qui l'étonne.

Il y a beaucoup de réponses, et je n'ai pas pris la peine de lire le code, mais en ce qui concerne la valeur par défaut, si c'est un filtre, cela me semble correcte de renvoyer une valeur par défaut (attention ensuite aux problèmes de conception), si c'est un validateur, non.

/*Ensuite pour les couleurs, ça ne me semble pas judicieux que ce soit au filtre de posséder la liste des couleurs, à moins qu'elle soit exhaustive, ce qui est loin d'être le cas. Son rôle c'est de remplir une tâche avec les données qu'on lui rentre ... elle n'est pas censée connaître les couleurs qu'on lui autorise avant qu'on les lui donne ... */

Rectification, je viens de relire, et tu as bien séparé ça. Ou est le problème alors ?

Re: [ZF] Zend_Filter -> WhiteList

Posté : 22 juin 2011, 18:53
par Moosh
Ensuite pour les couleurs, ( ...)
Rectification, je viens de relire, et tu as bien séparé ça. Ou est le problème alors ?
Oui les couleurs c'était juste pour donner un exemple.

Mon problème était plutôt.

Ca me semble tellement normal ce que je fais que je m'étonne que ca n'existe pas.

Je me demandais si
  • ca n'a simplement pas été développé -> si c'est ca, zou je l'ai fait (j'ai aussi fait BlackList)
  • Ca existe et j'ai mal cherché. J'y ai cru un moment avec Zend_Filter_Input, mais non
  • Ca n'existe pas parce que je commet une erreur de conception.
En gros je veux arriver à une situation (pas toujours intéressante, mais parfois, si) où je n'emmerde pas l'utilisateur qui se trompe, quand ca arrive je fallback sur une valeur de secours. (sans avertir l'utilisateur donc)