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

Contribuez / Téléchargez Sources et Outils PHP Discussion :

Router pour pattern MVC


Sujet :

Contribuez / Téléchargez Sources et Outils PHP

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

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 244
    Points
    20 244
    Par défaut Router pour pattern MVC
    Je vous propose aujourd'hui une classe permettant de mettre en place très simplement le pattern MVC.
    Cette classe est un router chargée de rediriger les requêtes reçues vers le bon controller et la bonne action.
    Les parties vue et modèles ne sont ici pas abordée, afin que chacun puissent faire comme il l'entend. Le but est de proposer une solution très simple pour débuter.

    Les fonctionnalités du router :



    Utilisation

    Quelque soit l'utilisation vous devrez avoir un htacces qui redirige toutes les requêtes via votre index.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    RewriteEngine on
    RewriteRule !\.(js|ico|gif|jpg|JPG|png|css)$ index.php
    Format d'un controller

    Afin d'utiliser le router, il faut respecter quelques règles pour les controller :

    nom : le nom doit être de la forme : nomController , par exemple : indexController ou encore errorController
    Paramètre : le constructeur du controller reçoit deux paramètres du routeur : la liste des paramètres passé par l'url et optionnellement le code langue
    methode : Un controller doit impérativement avoir une méthode index();

    Utilisation basique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    require 'Router.class.php';
     
    $router = Router::getInstance();
    //Définition du dossier contenant les controlleur
    $router->setPath('controller/');
    $router->load();
    Ajout de controller et d'action de base

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    require 'Router.class.php';
     
    $router = Router::getInstance();
    //Définition du dossier contenant les controlleur
    $router->setPath('controller/');
    // Si aucun controller n'est spécifié on appèlera accueilController et sa méthode index()
    $router->setDefaultController('accueil','index');
    // En cas d'url invalid on appèlera le controller errorController et sa méthode alert()
    $router->setErrorControllerAction('error', 'alert'); 
    $router->load();
    Définir une règle de routage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    require 'Router.class.php';
     
    $router = Router::getInstance();
    //Définition du dossier contenant les controlleur
    $router->setPath('controller/');
    // L'url http://monsite.com/actualites/archives/2012/01/PHP sera redirigé vers
    // actualitesController et sa méthode index(). Les paramètres annee, mois , catégorie seront passer au controller par le routeur.
    $router->addRule('actualites/archives/:annee/:mois/:categorie', array('controller' => 'actualites', 'action' => 'index'));
    $router->load();
    Je laisse volontairement de coté la partie multilangue pour le moment que je n'ai pas assez testé. Si elle vous intéresse il suffira de jeter un oeil au code , son utilisation est documentée.

    Je suis preneur de toutes les critiques que vous pourrez faire
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Il faut que je regarde en détail mais à vue de nez il n'est pas très différent du mien (sauf peut être pour les règles de routage qui son un poil plus élaborées).
    Pour ceux que ça intéresse c'est par ici: https://github.com/bdelespierre/php-...uter.class.php

    Sinon tu peux remplacer ta règle de réécriture par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !favicon.ico$
        RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
    </IfModule>
    ça t'évite de devoir spécifier toutes les extensions du monde à la main

  3. #3
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Bonjour,

    J'ai testé ce routeur sur un développement de test, il fonctionne correctement et est pratique d'utilisation

    Petit bémol toutefois quand j'ai voulu testé la fonctionnalité multilingue. Elle possède un petit bug, ne permet pas d'envoyer une série de variables aussi facilement qu'avec les règles de routage du mode non multilingue (nécessite obligatoirement un couple "nom/valeur") et aucun outil n'est fourni pour créer le tableau qui alimente la fonction setControllerTraduction. Certes à chacun sa préférence pour la manière de créer ce tableau mais une petite proposition aurait été pratique, ne serait-ce que pour faire des tests plus confortablement et rapidement.
    Je ferai une proposition avec des fonctionnalités plus avancées pour le mode multilingue dans un prochain post.

    Concernant le petit bug (toujours pour le mode multilingue) qu'il convient de corriger c'est en gras, $this->controller est redéfini une première fois puis réutilisé par la suite (alors qu'il conviendrait d'utiliser la valeur initiale) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //Permet d'avoir des URL multilingue
    if(!empty($this->tradController)){
    	if(isset($this->tradController[$this->codeLangue][$this->controller]['controllerName'])){
    		$controller = $this->tradController[$this->codeLangue][$this->controller]['controllerName'];
    		if(!empty($controller))
    			$this->controller = $controller;  // Ici
    	}
    	if(isset($this->tradController[$this->codeLangue][$this->controller]['actionsNames'][$this->action])){  // Ici
    		$action = $this->tradController[$this->codeLangue][$this->controller]['actionsNames'][$this->action];  // Ici
    		if(!empty($action))
    			$this->action = $action;
    	}
    }
    Enfin bon à part le mode multilingue qu'il conviendrait d'étoffer un peu, ce petit routeur fait bien son travail

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

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

    Informations forums :
    Inscription : Août 2003
    Messages : 6 692
    Points : 20 244
    Points
    20 244
    Par défaut
    Merci pour ton retour.
    Je t'avoue que la version multilangue avait été développée en coup de vent pour un projet mais finalement jamais testée , donc du coup doit y'avoir pas mal de chose à revoir ^^

    Si jamais tu veux apporter une correction tu peux toujours faire un pull request sur github :
    https://github.com/grunk/Pry

    C'est le projet complet du framework mais tu trouvera le router ici dans Pry/Controller

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/04/2010, 18h33
  2. Différenciation Formulaire dans servlet pour pattern MVC
    Par philoo_le_foo dans le forum Servlets/JSP
    Réponses: 13
    Dernier message: 02/09/2009, 19h18
  3. Réponses: 4
    Dernier message: 24/02/2009, 13h06
  4. quelques conseils pour projetc mvc
    Par pseudobidon57 dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 20/06/2007, 18h56
  5. Pattern MVC et barre de progression
    Par Tiberizz dans le forum Interfaces Graphiques en Java
    Réponses: 7
    Dernier message: 05/12/2006, 19h44

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