IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Exception dans routeur [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai Avatar de Zephire
    Homme Profil pro
    en devenir
    Inscrit en
    Janvier 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : en devenir

    Informations forums :
    Inscription : Janvier 2018
    Messages : 23
    Points : 19
    Points
    19
    Par défaut Exception dans routeur
    Bonjour,
    je suis au bout d'un gros projet, il me reste juste une petite chose à faire dont la nature est dans le titre de ce post. Je bloque complètement, y a-t-il quelqu'un de balèze qui pourrait juste me dire où est le petit caca dans mon code ? Je lui donnerai le lien du Gist. A part ça, tout le projet tourne comme sur des roulettes.
    Merci.

  2. #2
    Membre éclairé Avatar de Geoffrey74
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2007
    Messages
    515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2007
    Messages : 515
    Points : 760
    Points
    760
    Par défaut
    Hello,

    si tu veux de l'aide il va falloir être plus explicite et donner des détails de ton code, ici...

  3. #3
    Membre à l'essai Avatar de Zephire
    Homme Profil pro
    en devenir
    Inscrit en
    Janvier 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : en devenir

    Informations forums :
    Inscription : Janvier 2018
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    Ok, alors je détaille, mais je ne sais pas si ce sera facile de m'aider.

    1° : je suis en formation dans le cadre d'une reconversion, et donc mon code n'est certainement pas ce qu'il se fait de plus propre, mais je tiens à ne pas modifier ce que j'ai déjà écrit; d'abord parce que ça marche, et ensuite parce que je n'ai plus le temps. Je dois rendre le projet rapidement. Il s'agit d'un blog.

    L'application tourne parfaitement jusqu'ici, c'est juste que je ne parviens pas à implémenter une exception dans le routeur.

    Il s'agit d'une méthode handleRequest qui "analyse" les requêtes. Cette méthode est en 3 parties, 3 if . J'aimerais simplement ajouter un else pour dire "sinon, poum ! Exception."

    Eh bien ce n'est pas si simple !
    Toutes les routes sont dans un tableau contenant 'path' et 'controller'.

    Quelqu'un m'a déjà proposé de faire 2 compteurs , 1 comptant quand les routes match le tableau, 1 autre comptant quand ça matche pas, de faire la différence entre les deux, et si c'est différent du nombre de routes dans le tableau alors de lancer l'exception.

    J'avoue que je vois seulement de loin de quoi il s'agit. C'est-à-dire qu'au lieu de se fier au fait qu'une route match ou pas, on passe par un décompte du curseur. Je trouve ça un peu compliqué pour mon cerveau....

    J'ai aussi essayé de mettre en place une boucle switch (qui me semblait plus simple dans la logique) mais ça me met plein de messages d'erreur et au final je me suis dit que je préfère faire à partir de ce qui marche.

    (Bien entendu, j'ai essayé un simple 'else throw new exception' qui me balance systématiquement le fameux "Uncaught Exception".

    Alors s'il y a quelqu'un de balaise qui peut me dire quoi faire à partir de mon code ? Le problème est que jusqu'ici tout fonctionne, sauf que si quelqu'un tape n'importe quoi après le nom de domaine dans l'adresse, ça donne une page blanche.

    Bien entendu, je m'attends à me faire chambre sur l'écriture de mon code, mais j'en suis fier malgré tout parce que je pars de zéro. J'ai tout appris avec ce projet, depuis de longs mois.

    Voilà la méthode en question:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    public function handleRequest($request)
    {
        foreach ($this->routes as $route) {
    
            //  if /id detected
                if (preg_match($route->getRequirements(), $request, $id)) {
                    $new_id = trim($id[0], '/');
                    $regex = '#:id#';
                    $new_path = preg_replace($regex, $new_id, $route->getPath());
                    $route->setPath($new_path);
    
                    if ($route->getPath() === $request) {
                        $class = $this->createController($route->getController());
                        return $class($new_id);
                    }
            }
    
            // if ? detected -- token verifying and put in $_GET
               elseif (preg_match('#\?token=[\d+[a-zA-Z.]+#', $request, $param)) {
                    $_GET['token'] = trim($param[0], '\?token=');
                    $route->setPath($request);
                    $route->setController('\Framework\Controller\TokenPasswordController');
    
                    if ($route->getPath() === $request) {
                        $class = $this->createController($route->getController());
                        return $class();
                    }
            }
    
            // regular path
              elseif ($route->getPath() === $request) {
                     $class = $this->createController($route->getController());
                    if (preg_match('#updatepost_action#', $request) || preg_match('#write#', $request) ||
                        preg_match('#envoi#', $request) || preg_match('#check#', $request) ||
                        preg_match('#pswrd_reset_action#', $request)
                    )     {
                        return $class->action();
                    } else
                        return $class();
            }
    
            else  {
                throw new \Exception();
            }
    Bon courage et merci au(x) valeureux (euses) codeurs (euses) qui se dévouera (-ront).
    C'est vraiment la touche finale de mon projet.

  4. #4
    Nb
    Nb est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 148
    Points : 417
    Points
    417
    Par défaut
    C'est un peu dur à lire à cause l'indentation, mais il semblerait que ton code ait la structure suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if
    ....
    elseif
    ......
    elseif
    ......
    else
    throw Exception()
    Ce code ne generera une exception que si tu ne rentres dans aucun if ou elseif.

    Or par exemple dans ton premier if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if (preg_match($route->getRequirements(), $request, $id)) {
                    $new_id = trim($id[0], '/');
                    $regex = '#:id#';
                    $new_path = preg_replace($regex, $new_id, $route->getPath());
                    $route->setPath($new_path);
     
                if ($route->getPath() === $request) {
                    $class = $this->createController($route->getController());
                    return $class($new_id);
                }
            }
    si $route->getPath() === $request est faux ton code ne fait rien du tout et ne passera jamais dans ton ELSE qui balance l'exception.

    Comme il manque des accolades fermantes je ne suis pas sur de mon coup mais à mon avis en faisant un truc comme ca, ca devrait rouler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if(..){
    ....
    }elseif(..){
    ....
    }
    elseif(..){
    ....
    }
    throw Exception()

  5. #5
    Membre à l'essai Avatar de Zephire
    Homme Profil pro
    en devenir
    Inscrit en
    Janvier 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : en devenir

    Informations forums :
    Inscription : Janvier 2018
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    Merci pour la réponse ! Il s'agissait d'enlever le dernier "throw" c'est ça ? ça ne change rien
    J'ai toujours le uncaught exception.

    Apparemment cela a un rapport avec les routes parcourues dans le tableau de routes. Comme écrit plus haut, une des solutions proposées est de mettre 2 compteurs qui comparent le nombre de routes avec le nombre d' "essai" de match de la requête.

    On rajoute en haut de la classe:

    private $matches=0;

    Puis quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    public function getMatches()
       {
           return $this->matches;
        }
     
    public function match (string $request, string $route)
       {
           if ($request == $route) {
               $this->matches++
             }
     
           if ($request !== $route) {
               $this->matches++
            }
     
        Et là [si la différence entre les 2 donne un nombre différent du nombre de routes dans le tableau, alors j'envoie un message].
    En somme, c'est basé sur le nombre de requêtes tentées dans le tableau.
    Et désolé pour l'indentation, le copier coller depuis PHPStorm merdoie un peu. Je corrige.

  6. #6
    Nb
    Nb est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 148
    Points : 417
    Points
    417
    Par défaut
    Ma réponse etait basée sur ca
    Cette méthode est en 3 parties, 3 if . J'aimerais simplement ajouter un else pour dire "sinon, poum ! Exception."
    J'en ai donc déduis que tu voulais lancer une exception dans le cas où tu ne rentres dans aucun IF.
    Pour ce faire il faut supprimer le ELSE et faire le throw à la fin (en dehors des blocs if/elseif/elseif). Sans ca tu as des cas où tu vas passer dans un des IF qui peut ne rien retourner.
    Ex.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if (preg_match($route->getRequirements(), $request, $id)) {
                    $new_id = trim($id[0], '/');
                    $regex = '#:id#';
                    $new_path = preg_replace($regex, $new_id, $route->getPath());
                    $route->setPath($new_path);
     
                if ($route->getPath() === $request) {
                    $class = $this->createController($route->getController());
                    return $class($new_id);
                }
            }
    Si tu rentres là et que $route->getPath() === $request est faux ton code ne fais rien (ni retour, ni exception).

    J'ai toujours le uncaught exception.
    Cette remarque me fait dire que je n'ai peut être pas compris ton probleme en fait.

  7. #7
    Membre à l'essai Avatar de Zephire
    Homme Profil pro
    en devenir
    Inscrit en
    Janvier 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : en devenir

    Informations forums :
    Inscription : Janvier 2018
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    La boucle 'foreach' buggue avec la structure du tableau en le parcourant, en fait. Sans l'exception, ça passe, mais sinon il considère qu'aucune requête n'a sa correspondance dans le tableau de routes. Je peux te mettre le tableau si tu veux. C'est un tableau php classique.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VC6 et MFC] Exception dans MFC42D.dll
    Par Philippe320 dans le forum MFC
    Réponses: 8
    Dernier message: 09/12/2005, 14h14
  2. exception dans un constructeur
    Par xxiemeciel dans le forum C++
    Réponses: 25
    Dernier message: 23/11/2005, 18h14
  3. gestionnaire d'Exception dans DLL
    Par pirbd dans le forum Langage
    Réponses: 2
    Dernier message: 03/03/2005, 18h58
  4. Capture d'exception dans un constructeur
    Par declencher dans le forum Composants VCL
    Réponses: 8
    Dernier message: 03/02/2004, 12h52
  5. Réponses: 2
    Dernier message: 28/08/2003, 00h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo