Voici un petit tutoriel très simple pour ajouter des validateurs personnalisés à votre application Zend Framework. Cela se fait en deux secondes montre en main.

Partons du principe que votre application est déjà un minimum configurée avec l'autoloader :

<?php  
// application/Bootstrap.php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap  
{
    protected function _initAutoload()
    {
        $loader = new Zend_Application_Module_Autoloader(array(
            'namespace' => 'Default',
            'basePath'  => dirname(__FILE__)
        ));

        return $loader;
    }
}

Nous allons ajouter une ressource à l'application qui sera en fait un répertoire dans lequel nous allons ajouter nos validateurs, ajoutons et déclarons donc notre dossier « validators » dans notre application Zend Framework :

<?php  
// application/Bootstrap.php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap  
{
    protected function _initAutoload()
    {
        $loader = new Zend_Application_Module_Autoloader(array(
            'namespace' => 'Default',
            'basePath'  => dirname(__FILE__)
        ));

        // Ajoute la ressource "validator" dans le namespace par defaut de l'application
        $loader->addResourceType('validator', 'validators', 'Validator');

        return $loader;
    }
}

Allez ensuite dans votre répertoire « validators » et hop, créez des ressources comme pour les modèles, les contrôleurs ou les vues.
Les validateurs doivent hériter de la classe ZendValidateAbstract qui implémente l'interface ZendValidateInterface ce qui oblige votre classe à déclarer la méthode isValid($param).

<?php  
// application/validators/Custom.php
class Default_Validator_Custom extends Zend_Validate_Abstract  
{
    public function isValid($value)
    {
    }
}

Bon, c'est bien beau un validateur vide mais c'est inutile. Faisons un validateur simple type test de mot de passe avec message personnalisé pour l'erreur :

<?php  
// application/validators/Custom.php
class Default_Validator_Custom extends Zend_Validate_Abstract  
{
    const E_PASSWD = 'passwd';

    protected $_messageTemplates = array(
        self::E_PASSWD => 'Mot de passe incorrect !'
    );

    public function isValid($value)
    {
        $this->_setValue($value);

        if ($value === 'vph3Gv2x715r120cQrMep') {

            return true;
        }

        $this->_error(self::E_PASSWD);

        return false;
    }
}

Et voila, on a notre validateur personnalisé. Maintenant, dans notre formulaire, il suffit d'instancier la classe de notre validateur et ça marche tout seul.
Exemple :

<?php  
// application/forms/Connexion.php
class Default_Form_Connexion extends Zend_Form  
{
    public function init()
    {
        $this->setAction('/connexion/')
         ->setMethod('post')
         ->addElement('password', 'passwd', array(
                'label'         => 'Mot de passe',
                'required'      => true,
                'filter'        => 'StringTrim',
                'validators'    => array(
                    array('NotEmpty', true, array(
                        'messages' => 'Veuillez remplir le champ'
                    )
                ),
                array(new Default_Validator_Custom(), true)
         )))
         ->addElement('submit', 'send', array(
            'label' => 'Connexion' 
         ));
    }
}

Essayez et ça devrait fonctionner.

Vous venez d'apprendre en 20 secondes comment créer très simplement un validateur personnalisé à votre application. Même si la panoplie de validateurs est déjà bien riche au niveau du Zend Framework, je vous recommande de créer vous-même vos validateurs pour y gérer de manière plus simple et plus clair les messages d'erreur ; d'autant plus si vos validateurs sont complexes, évitez de surcharger le code de déclaration de vos formulaire et préférez instancier des classes.

Pour en savoir un peu plus sur l'écriture des Validateurs.


Joris Berthelot