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

EDI, CMS, Outils, Scripts et API PHP Discussion :

Réécriture, routage : Quel choix ?


Sujet :

EDI, CMS, Outils, Scripts et API PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut Réécriture, routage : Quel choix ?
    Salut à tous

    D'abord, désolé si ce topic est mal placé, j'en sais trop rien où le mettre

    Le principe actuel que j'ai concernant la réécriture et le routage des pages ne me satisfait pas (mal pensé au départ), et je tente de repartir d'une feuille blanche.

    Le problème c'est que je ne sais pas trop l'orientation à prendre, sans compter que j'ai peut être une mauvaise vision.
    Toujours est il que je tente petit à petit d'adopter le concept MVC.

    D'après ce que j'ai compris, il faudrait au moins renseigner le module et l'action dans les URLs.
    Qui serait quelque chose comme :
    Soit : domaine.com/index.php?module=accueil&action=index
    Soit : domaine.com/accueil/index.html

    Aussi, au niveau du .htaccess, j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)\.(html|php) index.php/$0 [PT]
    Donc j'ai opté que la réécriture concerne les .html ou .php (pour le moment)

    Déjà, est ce que le principe que le module soit le nom de la page et de mettre l'action que le controller devra exécuter est bon ?

    En partant de ce principe, il faudra que le controller de l'accueil est une méthode index
    -> fichier accueil.php
    -> classe Accueil {...}
    -> Méthode index() {...}

    Que je mette le module (ou le nom de la page) me parais indispensable, mais l'action, pas tant que ça, car la majorité des cas ça sera "index", l'action par défaut.

    Le problème que je perçois si j'omets de mettre l'action, c'est par exemple la page catégorie, qui avec l'action donnerait par exemple :
    domaine.com/categorie/index/une_categorie-10.html

    Et si je ne mets pas l'action en partant du principe que s'il y en a pas, c'est celle par défaut :
    domaine.com/categorie/une_categorie-10.html

    Ici, la logique est faussée car la 2ème position est théoriquement prévu pour l'action, mais ici c'est le nom (réécrit) de la catégorie.
    Je dirais qu'ici c'est quand même un détail.


    L'autre difficulté que je vois, c'est surtout celle là, c'est lors de la pagination rajouté un tri, par exemple :
    domaine.com/categorie/index/une_categorie-10/art_name/desc/3.html
    Donc un trie sur le nom des articles de la catégorie 10, et décroissant, en 3ème page.

    Voir
    domaine.com/categorie/index/une_categorie-10/art_name/desc/date/asc/3.html
    2 tries cette fois, sur le nom décroissant, et sur la date de création ascendant, en 3ème page.
    Je me dis que pour décortiquer ça, chaud les marrons


    Je me dit que si c'est trop compliqué de tout intégrer dans la réécriture, et bien faire comme ceci :
    domaine.com/categorie/index/une_categorie-10.html?tri=cat_name&ordre=des&page=3
    Donc en partie en paramètre (QUERY_STRING)


    Comment feriez-vous, quel serait selon vous le concept de réécriture assez souple ?

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Je t'expose rapidement comment marche le router que j'ai fait , cela devrait te donner des pistes.

    1- Coté Apache , je renvoi toutes les requêtes sur l'index :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    RewriteEngine on
    RewriteRule !\.(js|css|jpg...tous les truc que tu ne veux pas)$ index.php
    2- Ensuite dans ma page index.php j'instancie mon routeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $router = Controller_Router::getInstance();
    $router->setPath('includes/controllers/'); // je défini ou se trouve les controllers
    $router->addRule('test/regles/:id/hello', array('controller'=>'index','action'=>'monAction')); // Je défini ici une règle de routage qui redirigera l'url site.com/test/regles/5/hello vers le controller index et l'action monAction.
    Tu remarqueras que la règle de routage va répondre à ta problématique des arguments multiples.

    Une fois tous cela défini mes url marche comme ceci :
    monsite.com/controller/action/param-1/param-2/.../param-n
    Les paramètres sont donc dispo dans un tableau.

    Et avec les règles de routage je peux faire pointer n'importe quelle url sur n'importe quel couple controller/action


    Coté technique c'est assez simple :
    Je récupère l'url via
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $_SERVER['REQUEST_URI'];
    Et fait un petit traitement dessus pour récupérer ce dont j'ai besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $items = explode('/',$url);
    if(!empty($items))
    {
        $this->controller = array_shift($items);
        $this->action     = array_shift($items);
        $this->params    = $items;
    }
    A partir de là j'ai le controller à exécuté , l'action et les paramètres. Je peux donc faire à peut près tout ce que je veux ^^

    Si jamais l'url récupéré correspond à une règle de routage, le traitement sera bien entendu légèrement différent.

    En revanche il existe quelques limitations :

    - Il est possible de ne pas spécifier l'action (donc celle par défaut) mais on ne peut alors pas ajouter de paramètres
    - On doit forcément connaitre l'ordre des attributs passé ou alors utiliser une règle de routage auquel cas les attribut seront dispo dans un tableau avec la clé défini dans la règle ($param[':id'] pour reprendre mon exemple plus haut).
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre Expert
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Par défaut
    salut grunk,

    Ta combinaison est en effet bien pensé, personnellement j'ai eu à voir/travailler sur des modèles semblable.

    Comment gères-tu l'absence de mod_rewrite ?

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Citation Envoyé par Thes32 Voir le message
    salut grunk,

    Ta combinaison est en effet bien pensé, personnellement j'ai eu à voir/travailler sur des modèles semblable.

    Comment gères-tu l'absence de mod_rewrite ?
    Je le gère pas ^^
    J'ai la main sur tous mes serveurs donc pas vraiment inclus cette problématique dans le développement.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    J'ai mis un peu de temps, mais il me semble avoir saisie l'idée générale.
    Elle me semble aussi vachement bien

    L'idée serait donc de définir pour chaque controller (j'ai plutôt envie de dire chaque page) la règle, ceci dans le but de retrouver ces petits dans le REQUEST_URI, donc sans trop se soucier de l'ordre des paramètres.


    Il y a quand même un truc qui m'échappe dans ton exemple.
    Pourquoi avoir mis :id, 2 points devant le id ?
    Pourquoi donc le "hello" n'en a t-il pas ?
    Est ce une astuce que je n'aurais pas compris ?


    Un autre aspect jailli tout un coup.
    Il me semble qu'on peu considérer ici que les 2 premiers éléments que sont ...controller/action/... relève du routage pure.
    Du coup, tout de reste n'est pas du routage, mais des paramètres divers si on peu dire.
    En gros, ces paramètres là relèverait plus de paramètres GET.
    Ne faudrait il pas dispatcher dans le tableau GET ou autre classe Request ?


    Petite parenthèse d'ailleurs, j'utilise le terme dispatcher presque par hasard.
    En parcourant divers FrameWork, j'ai vu plusieurs fois des classes Dispatcher.
    Parmi les traitements quelles font, sont ils dans le même esprit que je viens d'évoquer précédemment, soit de mettre tel paramètre ici, tel autre là-bas ?


    Merci pour les idées en tout cas


    Comment gères-tu l'absence de mod_rewrite ?
    Comme je suis en pleine méditation, j'en sais trop rien, mais je me dis que si les paramètres ne sont pas dans le REQUEST_URI, ils devront être dans le QUERY_STRING, non ?
    Donc à l'origine, ce sont des liens, les infos devront être des paramètres GET.
    Enfin, il faudrait au moins que le nom de la page soit le nom du controller, qui correspondra au REQUEST_URI.
    Tout le reste devra alors êtres en paramètre GET : L'action, les paramètres optionnels.

    Ceci devrait donc permettre de faire certaines alternatives dans le routeur.
    Mais il vrai qu'il est plus simple de s'imposer le mod_rewrite.

    Enfin, c'est ainsi que je perçois les choses ... mais ce n'est pas encore fait.

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    Citation Envoyé par RunCodePhp Voir le message
    L'idée serait donc de définir pour chaque controller (j'ai plutôt envie de dire chaque page) la règle, ceci dans le but de retrouver ces petits dans le REQUEST_URI, donc sans trop se soucier de l'ordre des paramètres.
    Pas vraiment, la vérification des règles ayant un certains coût (expression régulière) il faut les utiliser intelligemment. Si une page remplie le "pattern" de base c'est à dire controller/action/param nulle besoin de définir une règle.
    Là ou les règles sont intéressante c'est lorsque tu as besoin de déplacer tes paramètres dans ton url (par exemple param1/controller/param2/param3/action/param4)

    Il y a quand même un truc qui m'échappe dans ton exemple.
    Pourquoi avoir mis :id, 2 points devant le id ?
    Pourquoi donc le "hello" n'en a t-il pas ?
    Est ce une astuce que je n'aurais pas compris ?
    Dans ma règles les mot précédé de ":" sont des mot clé qui indique la place d' un paramètre.
    "test" et "Hello" ne sont que du vent. Ca pourrait être foo et bar que le résultat serait le même , c'est à dire appel du controller et de l'action défini dans le tableau passé en paramètre


    Il me semble qu'on peu considérer ici que les 2 premiers éléments que sont ...controller/action/... relève du routage pure.
    Du coup, tout de reste n'est pas du routage, mais des paramètres divers si on peu dire.
    En gros, ces paramètres là relèverait plus de paramètres GET.
    Ne faudrait il pas dispatcher dans le tableau GET ou autre classe Request ?
    C'est une possibilité. mais dans mon cas comme la variable contenant les paramètre est transmise au controller , elle est accessible ensuite dans la vue et les modèles donc pas réellement besoin du classe gérant le tout.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Gestion des historiques, quel choix ?
    Par ftrifiro dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/09/2005, 15h18
  2. [SGBD] Quel choix en cette année 2005??
    Par Lambrosx dans le forum Décisions SGBD
    Réponses: 16
    Dernier message: 27/05/2005, 15h25
  3. Modélisation graphique - Quel choix ?
    Par netah25 dans le forum C++Builder
    Réponses: 2
    Dernier message: 03/03/2005, 17h17
  4. Réponses: 4
    Dernier message: 07/10/2004, 20h42
  5. Évolution d’une application existante. Quel choix ?
    Par BBerni dans le forum Décisions SGBD
    Réponses: 9
    Dernier message: 10/05/2004, 10h59

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