Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Modérateur
    Avatar de grunk
    Homme Profil pro Olivier
    Dév. Web / Android
    Inscrit en
    août 2003
    Messages
    3 016
    Détails du profil
    Informations personnelles :
    Nom : Homme Olivier
    Âge : 30
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Dév. Web / Android
    Secteur : Industrie

    Informations forums :
    Inscription : août 2003
    Messages : 3 016
    Points : 6 753
    Points
    6 753

    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 :
    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 :
    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 :
    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 :
    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 Confirmé Sénior
    Avatar de Benjamin Delespierre
    Profil pro Benjamin Delespierre
    Développeur Web
    Inscrit en
    février 2010
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Nom : Benjamin Delespierre
    Âge : 26
    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 932
    Points : 7 812
    Points
    7 812

    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 :
    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 Confirmé

    Homme Profil pro Alain Bontemps
    Développeur Web
    Inscrit en
    septembre 2010
    Messages
    2 538
    Détails du profil
    Informations personnelles :
    Nom : Homme Alain Bontemps
    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 : 2 538
    Points : 3 950
    Points
    3 950

    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 :
    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
    - Réalisations
    - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro Olivier
    Dév. Web / Android
    Inscrit en
    août 2003
    Messages
    3 016
    Détails du profil
    Informations personnelles :
    Nom : Homme Olivier
    Âge : 30
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Dév. Web / Android
    Secteur : Industrie

    Informations forums :
    Inscription : août 2003
    Messages : 3 016
    Points : 6 753
    Points
    6 753

    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
    Pry Framework php5

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •