Précédent   Forum du club des développeurs et IT Pro > PHP > Langage > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, FAQ, sources, etc. pour PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 20/01/2012, 15h41   #1
grunk
Modérateur
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 2 499
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 28
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : août 2003
Messages : 2 499
Points : 5 209
Points : 5 209
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
Type de fichier : php Router.class.php (10,1 Ko, 154 affichages)
grunk est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/01/2012, 17h40   #2
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 897
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
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 897
Points : 8 605
Points : 8 605
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
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 19h48.


 
 
 
 
Partenaires

Hébergement Web