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 :

système de routage


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 830
    Points
    5 830
    Billets dans le blog
    1
    Par défaut système de routage
    Bonjour,
    j'ai le système de routage suivant :
    routing.php :
    Code php : 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
    <?php declare(strict_types=1);
     
    $routes = [
        'vos-temoignages' =>'/controller/Vos-temoignages',
        'politique-de-confidentialite' =>'/controller/Politique-de-confidentialite',
        'nous-contacter' =>'/controller/Nous-contacter',
        'mentions-legales' =>'/controller/Mentions-legales',
        'home' =>'/controller/Accueil',
        'tarifs' =>'/controller/Tarifs',
        'les-nids-et-les-insectes' =>'/controller/Les-nids-et-les-insectes',
        'conseils' =>'/controller/Conseils',
        'action-form-contact' =>'/controller/Action-form-contact',
        'etre-rappele' =>'/controller/Etre-rappele',
        'action-form-rappel' =>'/controller/Action-form-rappel',
     
    ];
     
    $action = isset($_GET['action'], $routes[$_GET['action']]) ? $_GET['action'] : null;
     
    if ($action === null) {
        $ctrl = '/controller/Accueil';
    } else {
        $ctrl = $routes[$action];
    }
     
    $page = $ctrl.".php";

    et la page d'entrée du site (index.php) :
    Code php : 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
    <?php
     declare(strict_types=1);
       const DIR_ROOT = __DIR__.DIRECTORY_SEPARATOR;
       const APP_NAME_NS = 'PasDePanique';
     
       require DIR_ROOT.'vendor'.DIRECTORY_SEPARATOR.'autoload.php'; //autoload de composer
       require DIR_ROOT.'config'.DIRECTORY_SEPARATOR.'bootstrap.php';//definition of the constants
     
       // ROUTING : en charge d'appeler le bon controleur
       include 'config/routing.php';
       ?>
     
    <html>
    <?php
        include("controller/head.html");
    ?>
    <body>
    <?php
        include("controller/header.html");
        include("controller/menu.html");
    ?>
        <main class="container">
            <section>
                <?php include $page; ?>
            </section>
        </main>
     
        <?php include("controller/footer.html");?>
    <script type="text/javascript" src="../main.js"></script>
    </body>
    </html>
    Donc chaque page sera en fait incluse dans index.php (ligne 24 de index.php). Simplement, c'est pas la bonne façon d'inclure un fichier car :
    Warning: include(/controller/Accueil.php): Failed to open stream: No such file or directory in C:\projets\arnaud\index.php on line 24
    Quelle serait la bonne syntaxe SVP ?

  2. #2
    Membre éclairé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 358
    Points : 734
    Points
    734
    Par défaut
    Bonjour,

    Essaye d'enlever le slash initial pour utiliser des chemins relatifs dans la déclaration de tes routes et pour la route par défaut (comme pour les autres include) : 'home' =>'controller/Accueil' et $ctrl = 'controller/Accueil';

  3. #3
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 791
    Points : 3 058
    Points
    3 058
    Par défaut
    Tu fais une erreur par omission : tu fais un include de $page sans même avoir vérifié que le fichier existe.

    En programmation défensive, c'est une faute et cela mène à des bugs ultérieurs.

  4. #4
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 830
    Points
    5 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par cavo789 Voir le message
    Tu fais une erreur par omission : tu fais un include de $page sans même avoir vérifié que le fichier existe.
    Etant le seul programmeur, les fichiers indiqués dans routing.php existent forcément...

    Citation Envoyé par cavo789 Voir le message
    En programmation défensive
    jamais vu ce terme...

    Pytet ; ça marche !

  5. #5
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 791
    Points : 3 058
    Points
    3 058
    Par défaut
    Ouch... Que tu sois seul ou que vous travaillez à plusieurs cela n'a rien à voir.

    Quand tu fais un include il est sain de vérifier que le fichier existe avant. Ton projet va évoluer et peut-être qu'un jour tel fichier disparaîtra pour x raisons.

    Si tu ne fais pas cette vérification, c'est très bof et un code peu propre.

    (et si tu avais écrit le test, tu n'aurais pas poster ici car immédiatement, tu aurais compris la source du problème)

  6. #6
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 830
    Points
    5 830
    Billets dans le blog
    1
    Par défaut
    J'ai mis du temps à mettre au point le test, mais ça y est :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (($action === null)||(!(file_exists(DIR_ROOT.$routes[$action].".php")))) {
        $ctrl = 'controller/Accueil';
    } else {
        $ctrl = $routes[$action];
    }

  7. #7
    Membre expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 791
    Points : 3 058
    Points
    3 058
    Par défaut
    Tu avais une variable $page en ligne 26 dans ton tout premier post.

    Il suffit de vérifier si file_exists($page) après cette ligne 26.

    Si pas trouvé, tu fais un throw() pour stopper ton code avec une exception qui dit clairement pourquoi càd parce que ton fichier n'existe pas.

  8. #8
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 830
    Points
    5 830
    Billets dans le blog
    1
    Par défaut
    Pas tout à fait car au moment de faire le test, $page n'existe pas encore...

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

Discussions similaires

  1. [POO] ajout d'une nouvelle méthode au système basique de routage
    Par laurentSc dans le forum Langage
    Réponses: 2
    Dernier message: 21/12/2019, 09h13
  2. [tables systèmes] extraction de la structure d'une base
    Par laffreuxthomas dans le forum Autres SGBD
    Réponses: 6
    Dernier message: 23/03/2006, 13h24
  3. [système] Comment ajouter un item dans le context menu de Windows ?
    Par ddmicrolog dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 29/06/2005, 17h03
  4. [Système] Vider le Presse Papier
    Par babe dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/09/2002, 17h46
  5. IA avec le système de note
    Par scorpiwolf dans le forum C
    Réponses: 4
    Dernier message: 06/05/2002, 12h13

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