Architecture MVC, URL rewriting et dossiers virtuels

Nouveau WRInaute
Bonjour à tous,

Je suis nouveau ici, merci pour votre accueil.

Je suis entrain de développer un backoffice pour un CMS maison pour finaliser mon projet de fin d'année et valider mon titre.

Il est développé en PHP selon l'architecture MVC, et donc je n'ai qu'une seule page : index.php, tout le reste se passe dans les contrôleurs en fonction des GET passés dans l'URL.

Tout fonctionne très bien, mais j'aimerai rendre les URL plus lisibles en créant des dossiers virtuels, et en cachant le nom des get. Je me servirai aussi de l'URL rewriting pour le front-end, afin d'améliorer le référencement des articles par exemple.

Donc dans mon cas, admettons que je veuille afficher la page :
Code:
http://localhost/PHP/STAGE/index.php?c=User&a=edit&u_id=1

et que je veuille qu'elle apparaisse comme ça :
Code:
http://localhost/STAGE/user/edit/1

Devrais-je écrire ? :
Code:
RewriteRule ^user/edit/([0-9]+)/?$ /index.php?c=User&a=edit&u_id=$1 [L]

ça ne fonctionne pas, et me recharge la page localhost de XAMPP.
L'URL rewriting est activé et fonctionne avec les exemple simples des tutos.

Merci pour votre aide.

Romain.
 
WRInaute accro
Tu t'es vraiment cassé la tête pour rien:
https://www.webrankinfo.com/forum/pratique-htaccess-lire-avant-poser-t13288 ... l#p1217718

index.php/User/edit/1 est bcp plus facilement rewrité:
PHP:
<span class="syntaxdefault"><br /></span><span class="syntaxkeyword"><?</span><span class="syntaxdefault">php<br /></span><span class="syntaxkeyword">list(,</span><span class="syntaxdefault"> $controller</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $action</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $id</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> explode</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'/'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $_SERVER</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'PATH_INFO'</span><span class="syntaxkeyword">]);<br />&nbsp;</span><span class="syntaxdefault"></span>
C'est comme ça que font les principaux CMS.

Encore mieux:
http://upshots.org/php/php-regexrouter
https://gist.github.com/dave1010/1214164
 
Nouveau WRInaute
Merci pour ta réponse rapide.

Je ne comprends pas tout. Ou dois-je mettre la fonction explode du PATH_INFO ?

j'ai un autoroutage dans mon index pour les controlleurs et les actions de chaque contrôleur.

si je met ce code dans mon htaccess :
Code:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php/$1 [L,QSA]

ça ne me charge pas la bonne page, uniquement l'index du backoffice, et sans charger le CSS, malgré le fait que j'ai ajouté la ligne : <base href="http://localhost/PHP/STAGE/index.php" /> dans le head de l'index. (Je pense que je dois aussi changer le chemin des fichiers CSS et JS du coup). Le plus gros du problème étant que ça me charge pas la page demandée.

Comment fonction l'explode du PATH_INFO exactement ? J'ai du mal à m'imaginer le cheminement.

Merci encore.
 
WRInaute accro
Fait un test:
index.php/foo/bar/baz

PHP:
<span class="syntaxdefault"></span><span class="syntaxkeyword"><?</span><span class="syntaxdefault">php<br />print_r</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$_SERVER</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'PATH_INFO'</span><span class="syntaxkeyword">]);&nbsp;</span><span class="syntaxdefault"></span>
 
Nouveau WRInaute
OK ça me renvoie : /foo/bar/baz
Donc si je l'explode ça me les sépare.

Mais je comprends pas comment ça reconstruit la bonne URL en fait ?
Ou alors j'ai pas besoin de reconstruire l'URL et c'est directement ça que je fais passer dans mon autorouteur ?
 
WRInaute accro
Voilà exactement, ensuite le rewrite est bcp plus simple que les paramètres en $_GET.
 
Nouveau WRInaute
OK j'y vois un peu moins flou,

Le fait est que pour le contrôleur est les actions, ça sera assez simple de modifier mon autorouteur, par contre pour mes GET, ils ne sont pas toujours identiques, voir pas dans le même ordre, de plus, ça m'oblige du coup à recoder toutes mes methodes du contrôleur exploitant les GET ?

Exemple pour les users, mes get pour l'id sont "u_id" alors que pour les articles ce sont des "a_id"

Alors soit je comprends pas vraiment la totalité de la solution, soit ça va me prendre des jours de tout recoder.

Autre question, si mon index.php explode l'URL pour rediriger vers l'autorouteur, à quoi me sert htaccess ?

Merci encore.
 
WRInaute accro
OK à toi de voir :)

Avec PATH_INFO, le .htaccess servirait à rewriter: -http://example.com/index.php/controller/action/params en -http://example.com/controller/action/params avec 1 seule règle de rewrite.
 
Nouveau WRInaute
Oui effectivement j'aimerai supprimer le index.php :)

Et donc ce que j'arrive pas encore à imaginer, c'est comme différencier les types de get qui peuvent passer dans l'URL.

Exemple si dans l'URL j'ai deux identifiants différents exemple u_id et a_id (c'est un exemple) comment je différencie lequel est lequel ?

Puisque ça donnerai article/edit/1/34
 
Nouveau WRInaute
Salut,

Je reviens vous dire que pour moi c'était trop compliqué de mettre en place ces solutions étant donné que tout mon MVC est déjà codé. Finalement en quelques lignes de htaccess je suis arrivé au résultat voulu et c'est bien plus simple à comprendre pour moi. (je me suis fait aider parce que je suis vraiment mauvais en preg_match).

L'avantage aussi c'est que les URL non réécrites fonctionnent toujours.

Code:
RewriteRule ^articles/catdelete/(\w+)$ index.php?c=Articles&a=catdelete&c_id=$1 [L]
RewriteRule ^articles/catedit/(\w+)$ index.php?c=Articles&a=catedit&c_id=$1 [L]

RewriteRule ^articles/tagdelete/(\w+)$ index.php?c=Articles&a=tagdelete&t_id=$1 [L]
RewriteRule ^articles/tagedit/(\w+)$ index.php?c=Articles&a=tagedit&t_id=$1 [L]

RewriteRule ^articles/(\w+)/(\w+)$ index.php?c=Articles&a=$1&a_id=$2 [L]

RewriteRule ^user/(\w+)/(\w+)$ index.php?c=User&a=$1&u_id=$2 [L]

RewriteRule ^(\w+)/(\w+)$ index.php?c=$1&a=$2 [L]

Merci encore pour l'aide.
 
Discussions similaires
Haut