Partage
  • Partager sur Facebook
  • Partager sur Twitter

redirection avec protocole http 400

    15 février 2019 à 10:08:38

    Bonjour,

    J'ai un formulaire de contact qui permet d'envoyer des mails.

    J'y ai mis la librairie Validator qui permet de valider les données et j'utilise les codes http pour valider ou invalider les requêtes sans perte de données au cas où mon formulaire serait partiellement correct grâce à un Middleware que voici.

        public function __invoke( Request $request,Response $response, $next)
        {
            $this->twig->addGlobal('old', isset($_SESSION['old']) ? $_SESSION['old'] : []);
    
            if(isset($_SESSION['old'])){
                unset($_SESSION['old']);
            }
    
            $response = $next($request, $response);
            if ($response->getStatusCode() === 400){
                $_SESSION['old'] = $request->getParams();
            }
            return $response;
        }



    Cependant pour ne pas que lorsque mon formulaire est validé et envoyé il redirige vers le formulaire entièrement prérempli des dernières données, il est réinitialiser entièrement grâce au code http 302 qui reconnait un formulaire valide.

        //fonction du controller pour la redirection
        public function redirect($response, $name, $status = 302){
            return $response->withStatus($status)->withHeader('Location', $this->router->pathFor($name));
        }

    Le problème est que maintenant lorsque le formulaire n'est pas entièrement correct il redirige vers une page blanche au lieu de soulever les erreurs et il ne garde plus en mémoire les données du formulaires qui aurait pu être correct.

    Voici la fonction qui fait l'envoi du formulaire

        public function postContact(RequestInterface $request, ResponseInterface $response){
            $errors = [];
            Validator::email()->validate($request->getParam('email')) || $errors['email'] = 'Votre email n\'est pas valide';
            Validator::notEmpty()->validate($request->getParam('name')) || $errors['name'] = 'Veuillez entrer votre nom';
            Validator::notEmpty()->validate($request->getParam('content')) || $errors['content'] = 'Veuillez écrire un message';
            if(empty($errors)){
                $message = (new \Swift_Message())
                    ->setSubject('Message de contact')
                    ->setFrom([$request->getParam('email') => $request->getParam('name')])
                    ->setTo('contact@test.fr')
                    ->setBody("un email vous a été envoyé :
                {$request->getParam('content')}");
                $this->mailer->send($message);
                $this->flash('Votre message a bien été envoyé');
                return $this->redirect($response,'contact');
            } else {
                $this->flash('Certains champs n\'ont pas été rempli correctement. ', 'error');
                $this->flash($errors, 'errors');
                return $this->redirect($response,'contact', 400);
            }
    
        }


    J'ai essayé plusieurs trucs soit en modifiant la condition de retour du Old en le retournant si le code http était différent de 302 mais il ne garde plus rien en mémoire.

    Ou en forçant la fonction redirect() à mettre le status en 302 mais la encore cela ne fonctionne pas.

    Merci d'avance pour votre aide :)

    -
    Edité par OkazakiUshio 15 février 2019 à 10:37:49

    • Partager sur Facebook
    • Partager sur Twitter

    Tester c'est douter

      15 février 2019 à 10:26:49

      Salut !

      Petite précision : les nombres que tu mentionnes ne sont pas des protocoles, mais des codes de statuts du protocole HTTP.

      Ensuite, une redirection se fait forcément avec un code de statut 3##, les codes 4## sont pour des erreurs client et n'impliquent pas de redirection. Les codes 3## font que le navigateur relance automatiquement une requête, les codes 4## non.

      Soit tu rediriges réellement, et je n'ai pas vraiment d'autre code que le 302 à te proposer (éventuellement 312 si c'est parce qu'un champ obligatoire n'est pas rempli, mais bon), mais effectivement tu perds les saisies (peut-être que le 307 pourrait palier cela, mais aucune garantie que ce soit implémenté par tous les navigateurs), soit tu rends à nouveau le formulaire en envoyant le code 400, mais tu es certain de pouvoir conserver les saisies.

      J'avoue que depuis le temps, je cherche encore une source qui liste et explique de manière plus humaine les différents codes de statut et leur utilité avec des exemples. La plupart des sites qui listent les codes reprennent bêtement la définition des RFC, et c'est pas assez clair à mon goût, et surtout trop sujet à interprétation, tandis que les RFCs sont trop touffues et techniques.

      -
      Edité par Ymox 15 février 2019 à 10:37:23

      • Partager sur Facebook
      • Partager sur Twitter
        15 février 2019 à 10:37:08

        Oui @Ymox effectivement c'est les codes dont je parle je corrige ça.

        C'est justement quand je rends le formulaire avec le code 400 qu'il me renvoi une page blanche. Mais lorsque je clique sur la flèche "page précédente" sur mon navigateur il me renvoi ce qu'il doit afficher normalement. C'est à dire le formulaire avec les erreurs de remplissage et les données saisies qui seraient valide.

        Bien sûr comme tu dis une sources avec les codes de statut expliqués pas à pas avec leur utilité et des exemples serait très utile pour beaucoup de monde(un prochain cours OC peut être :lol:).

        • Partager sur Facebook
        • Partager sur Twitter

        Tester c'est douter

          15 février 2019 à 10:47:36

          Actuellement, tu ne rends pas le formulaire, tu tentes de rediriger avec un statut 400 si j'en crois ton code. Ce n'est à la fois pas la même chose et contradictoire.

          Le fait que tu aies une page blanche vient très probablement du fait que $response ne contient rien — je ne vois nulle part dans ton action postContact une ligne qui la modifie.

          • Partager sur Facebook
          • Partager sur Twitter

          redirection avec protocole http 400

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown