Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème d'égalité pas égale

Sujet résolu
    6 février 2024 à 18:50:53

    J'ai une classe Router avec une fonction route() :

        public function route($url)
        {
            foreach ($this->routes as $route => $params) {
                // Remplace les annotations dans la route par des regex
                $pattern = '#^' . preg_replace('#\{([\w]+)\}#', '([^/]+)', $route) . '$#';
    
                if (preg_match($pattern, $url, $matches)) {
                    // Supprime le premier élément qui contient l'URL complète
                    array_shift($matches);
    
                    // Appelle la méthode du contrôleur avec les paramètres
                    list($controllerClass, $action) = $params;
                    $controller = new $controllerClass();
    
                    // Rendre la vue en utilisant Twig
                    echo $this->twig->render($action . '.twig', $controller->$action(...$matches));
                    return;
                }
            }
            // Si aucune route n'est trouvée, affiche la page 404
           echo $this->twig->render('404.twig');
        }
    }

    Pour info, 

    $this->routes

    Me retourne bien le résultat attendu.

    Toutefois, j'ai un problème que je ne comprend pas : malgré que

    $pattern (#^GET /$#)
    soit égal à
    $url  (#^GET /$#)
    la condition 

    if (preg_match($pattern, $url, $matches)) 

    n'est pas valide. Par conséquent, le code de la condition ne d'effectue pas

    j'ai fait le test

    if($pattern == $url){
        echo 'vrai';
    }else{
        echo 'faux';
    }

    Ca m'affiche 'faux'.

    Je  comprends pas. J'ai vérifier la correspondance d'encodage et c'est la même pour les 2 (ASCII) j'ai testé en UTF-8, pareil.

    Je suis désespéré de pas comprendre :(

    Merci d'avance pour votre aide.


    -
    Edité par FCL31 6 février 2024 à 18:56:14

    • Partager sur Facebook
    • Partager sur Twitter
      6 février 2024 à 19:36:36

      Que valent $url et $route ? (var_dump($url, $route);)

      -
      Edité par julp 6 février 2024 à 19:46:33

      • Partager sur Facebook
      • Partager sur Twitter
        6 février 2024 à 21:41:44

        Ah oui.

        $pattern = '#^GET /$#'

        $urm = '/monsite/'

        J'avais log avec 

        file_put_contents($file, $pattern, FILE_APPEND);

        et

        file_put_contents($file, $url, FILE_APPEND);

        Les 2 me donnaient '#^GET /$#'.
        My bad.

        le problème doit donc venir de mon fichier index.php

        $router = new Router($routes);
        
        // Récupération de l'URL demandée
        $url = filter_input(INPUT_SERVER, 'REQUEST_URI', FILTER_SANITIZE_URL);
        
        // Supprime la partie de l'URL après le point d'interrogation (si présente)
        $url = strtok($url, '?');
        
        // Routage de la demande vers le bon contrôleur et l'action correspondante
        $router->route($url);


         lors de la construction de $url.
        non ?

        Mais même $url devrait être égal à '/' pour étant donné que je veux aller sur le lien

        http://localhost/monsite/


        Je sais pas trop. dans mon fichier route.php; j'attend '/' en tout cas

        -
        Edité par FCL31 6 février 2024 à 21:57:50

        • Partager sur Facebook
        • Partager sur Twitter
          6 février 2024 à 22:14:43

          Non, $_SERVER['REQUEST_URI'] vaudra '/monsite/' puisque tu n'es pas à la racine ... (http://localhost/ != http://localhost/monsite/)

          -
          Edité par julp 6 février 2024 à 22:16:13

          • Partager sur Facebook
          • Partager sur Twitter
            6 février 2024 à 22:17:23

            Mais alors, comment faire ?

            c'est au niveau de $ pattern qu'il faut faire quelque chose ?

            -
            Edité par FCL31 6 février 2024 à 22:19:36

            • Partager sur Facebook
            • Partager sur Twitter
              6 février 2024 à 22:23:55

              Où est-ce que tu prends REQUEST_METHOD ?

              Par rapport à la racine qui ne l'est pas ?

              • Dédier un VirtualHost à ton projet pour y être
              • Gérer (configurable) le fait qu'il puisse ne pas l'être, ainsi tu rajoutes le chemin de base de ton application en préfixe au pattern qui doit être matché

              -
              Edité par julp 6 février 2024 à 22:27:12

              • Partager sur Facebook
              • Partager sur Twitter
                6 février 2024 à 22:48:15

                Comment faire ta seconde proposition ?
                (elle m'intéresse :) )

                je voudrais que 

                http://localhost/monsite/

                ne renvoie sur la route 

                'GET /' => [HomeController::class, 'index'],

                -
                Edité par FCL31 6 février 2024 à 23:03:07

                • Partager sur Facebook
                • Partager sur Twitter
                  6 février 2024 à 23:16:07

                  De la même manière que tu définis tes paramètres de connexion à la base de données ?

                  Par contre avec la façon dont tu définis tes routes, tu ne peux pas simplement la concaténer (et je l'ajouterais dynamiquement quand je cherche la route plutôt que de le faire à leurs définitions). Il faudrait un preg_replace ?

                  $http_root_directory = '/monsite/'; # à chercher dans ta "configuration"
                  $route = preg_replace('~/~', $http_root_directory, $route, 1);
                  # ... (la suite/ton autre preg_replace)
                  

                  Ou alors, le soustraire de $url :

                  $http_root_directory = '/monsite/'; # à chercher dans ta "configuration"
                  $url = substr_replace($_SERVER['REQUEST_URI'], '/', 0, strlen($http_root_directory));
                  

                  -
                  Edité par julp 7 février 2024 à 0:49:29

                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 février 2024 à 23:44:06

                    Nikel, je commance à m'en sortir ^^

                    Toutefois, dans mon fichier index.php, j'ai

                    $router->route($url, $request_method);

                    Je peut donc récupérer $request_method dans la classe.

                    j'ai donc fait 

                    $url = $request_method . ' ' . substr_replace($_SERVER['REQUEST_URI'], '/', 0, strlen($site_direcory));

                    J'ai été obligé d'ajouter ' ' entre $request_method et substr_replace.
                    C'est la bonne pratique ?

                    Sinon, c'est good, je vais bien sur la bonne page comme tel :)

                    -
                    Edité par FCL31 6 février 2024 à 23:45:01

                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 février 2024 à 0:39:08

                      Tu as bien fait, je n'avais pas pris en compte la méthode HTTP.

                      C'est la solution qui me paraît finalement la plus simple et propre.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        7 février 2024 à 0:48:35

                        Je te remercia beaucoup.

                        Tu es un boss :)

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Problème d'égalité pas égale

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        • Editeur
                        • Markdown