Collecter des messages d'erreur

La classe Errors que propose le framework ICanBoogie est une classe générique qui permet la collecte de messages d'erreur. Une instance est en général partagée par plusieurs composants pour collecter les erreurs qui peuvent survenir durant un processus, par exemple entre l'opération, le validateur du formulaire et le validateur du modèle lors de la mise à jour d'un enregistrement. Les erreurs peuvent être générales (pour tout un processus) ou associées à un identifiant comme celui d'un champ de formulaire.

Collecte des messages

On utilise une instance de la classe Errors pour collecter les messages d'erreur, à la manière d'un tableau associatif qui aurait la particularité de collecter la valeur d'une même clé plutôt que de l'écraser.

On notera que la lecture d'un index non défini n'entraine pas d'erreur d'accès mais renvoie simplement la valeur null.

<?php

namespace ICanBoogie;

$e = new Errors();
$e['username'] = "is too funny";
var_dump($e['username']$e['password']);
#=> "is too funny", null

Les erreurs générales

Toutes les erreurs ne sont pas forcément causées par des paramètres invalides, parfois c'est tout un processus qui ne peut être accompli pour des raisons qui n'ont rien à voir avec ceux-ci, par exemple une commande ne pouvant être honorée parce que le stock est tombé à zéro.

Les messages d'erreur générale sont ajoutés en utilisant la notation incrémentielle [], ou en utilisant l'identifiant null qui leur est réservé : [null].

<?php

$e = new Errors();
$e[] = "This product is no longer available";
var_dump($e[null]);
#=> "This product is no longer available"

Plusieurs messages pour un même identifiant

Plusieurs messages d'erreur peuvent être associés à un même identifiant, dans ce cas plutôt qu'une chaine de caractères c'est un tableau associatif contenant tous les messages associés qui est renvoyé :

<?php

$e['username'] = "is too funny";
$e['username'] = "has no vowel";
var_dump($e['username']);
#=> ["is too funny", "has no vowel"];

Connaitre le nombre de messages d'erreur collectés

Comme pour n'importe quel tableau associatif on utilisera la fonction count() pour connaitre le nombre de messages d'erreur collectés. Tous les messages d'erreur sont comptabilisés, même s'ils sont associés à un même attribut :

<?php

$e = new Errors();
count($e);
#=> 0
$e['username'] = 'is too funny';
$e[] = 'Unable to register user';
count($e);
#=> 2
$e['username'] = 'is too short anyway';
count($e);
#=> 3

Parcourir les messages d'erreur collectés

En utilisant la construction foreach il est possible de parcourir les messages d'erreur collectés. Tous les messages sont parcourus, même lorsqu'ils sont associés à un même attribut et qu'ils ont donc la même clé. Les messages d'erreur générale se trouvent toujours en première position.

<?php

$e = new Errors();

$e['username'] = 'is too funny';
$e['username'] = 'is too short anyway';
$e[] = 'Unable to register user';

foreach($e as $attribute => $message)
{
    if ($attribute === null)
    {
        echo "<h3>$message</h3>";
    }
    else
    {
        echo "<p>$attribute $message</p>";
    }
}

Donnera :

<h3>Unable to register user</h3>
<p>username is too funny</p>
<p>username is too short anyway</p>

Parcourir les messages d'erreur collectés en utilisant une fonction de rappel

La méthode each() peut être utilisée pour parcourir les messages d'erreur collectés en utilisant une fonction de rappel :

<?php

$e->each
(
    function($attribute$message)
    {
        if ($attribute === null)
        {
            echo "<h3>$message</h3>";
        }
        else
        {
            echo "<p>$attribute $message</p>";
        }
    }
);

Supprimer les messages

On utilise la fonction unset() pour supprimer les messages d'erreur générale ou ceux associés à un identifiant.

<?php

unset($e[null]);
unset($e['username']);

La méthode clear() permet quant à elle de supprimer tous les messages collectés.

<?php

$e = new Errors();
$e['username'] = 'is too funny';
$e[] = 'Unable to register user';
var_dump(count($e));
#=> 2
$e->clear();
var_dump(count($e));
#=> 0

Laisser un commentaire

Pas de commentaire