2017-09-21 4 views
1

Je crée donc cette application de connexion et j'ai des problèmes pour afficher les messages d'erreur corrects lors de l'enregistrement. Je veux que toutes les exceptions soient levées et pas seulement une exception dans une méthode "try...catch".Affichage de plusieurs messages d'exception en PHP

C'est donc la configuration:

// EXTENDED EXCEPTION CLASSES 
class AException extends Exception { 

    public function __construct($message = null, $code = 0) { 
     echo $message; 
    } 
} 
class BException extends Exception { 

    public function __construct($message = null, $code = 0) { 
     echo $message; 
    } 
} 

// INDEX.PHP 

try { 

    $register = new RegisterController(); 

} catch (AException | BException $e) { 

    $e->getMsg(); 
} 

J'ai plusieurs facteurs qui peuvent déclencher l'exception, et je voudrais que tous les exceptions à déclencher et capturé par exemple si le formulaire de registre a été posté vide, il devrait y avoir une exception pour nom d'utilisateur étant vide, une autre exception pour le mot de passe étant vide etc ..

class RegisterController { 
    public function __construct() { 
    if (!empty($_POST)) { 
     $this->checkUserInput(); 
     $this->checkPassInput(); 
    } 
} 

//... executing code 

private function checkUserInput() { 
    if (strlen($_POST['username']) < 3) { // check character length bigger than 3 
     throw new \AException("Username has too few characters."); 
    } 
} 

private function checkPassInput() { 
    if (strlen($_POST['password']) < 3) { // check character length bigger than 3 
     throw new \BException("Password has too few characters."); 
    } 
} 
} 

Alors, comment puis-je faire mon « try...catch » -method écho à la fois la jetée des exceptions? C'est possible?

En ce moment, seule la première exception message lancé est affiché, donc je suppose que je dois trouver un moyen pour le script de continuer après une exception a été levée ...

post-scriptum Pour clarifier davantage: si un formulaire de registre est affiché avec des champs d'entrée vides, par ex. l'entrée du nom d'utilisateur et du mot de passe est vide, je veux que le code répète deux messages d'exception, les deux "Nom d'utilisateur a trop peu de caractères". et "Le mot de passe a trop peu de caractères.".

+0

Ce n'est pas comment les exceptions fonctionnent. Vous essayez d'utiliser des exceptions pour le contrôle de flux, c'est un "non". Les exceptions sont destinées à mettre fin à une exécution immédiatement. Vous voulez probablement enregistrer des "incidents" dans un journal ou un catalogue dans lequel vous pouvez les lire depuis un autre dans la portée de l'appel. – arkascha

Répondre

1

Ce n'est pas ainsi que le mécanisme try/catch est supposé fonctionner. Il n'est pas destiné à signaler les notifications aux utilisateurs finaux, mais à prendre des mesures par programmation si une situation indésirable se produit.

Ce que vous voulez est un simple validation de formulaire:

class RegisterController { 
    public $errors = []; 

    public function __construct() { 
    if (!empty($_POST)) { 
     $this->checkUserInput(); 
     $this->checkPassInput(); 
    } 

    private function checkUserInput() { 
     if (strlen($_POST['username']) < 3) { // check character length bigger than 3 
      $this->errors[] = "Username has too few characters."; 
     } 
    } 

    private function checkPassInput() { 
     if (strlen($_POST['password']) < 3) { // check character length bigger than 3 
      $this->errors[] = "Password has too few characters."; 
     } 
    } 
} 

Ensuite, vous pouvez utiliser quelque chose comme:

$register = new RegisterController(); 
if (!empty($register->errors)) { 
    foreach ($register->errors as $error) { 
     echo '<div class="error">' . $error . '</div>'; 
    } 
} 
+0

Je fais la méthode de connexion pour un projet d'école, et il a été demandé d'utiliser l'exception comme un message à l'utilisateur. Supposons que le module de connexion ne soit pas supposé être pour un utilisateur final, mais peut-être un autre développeur. Quoi qu'il en soit, votre réponse m'a conduit dans la bonne direction, donc je vais marquer cela comme la bonne réponse – Jesper