Messages: 11

Enregistré le: 31 Mai 2016

Message le Mar Mai 31, 2016 10:23

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: Tout sélectionner
http://localhost/PHP/STAGE/index.php?c=User&a=edit&u_id=1


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


Devrais-je écrire ? :
Code: Tout sélectionner
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.
Haut
10 Réponses
Messages: 8554

Enregistré le: 14 Mai 2003

Message le Mar Mai 31, 2016 11:51

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

index.php/User/edit/1 est bcp plus facilement rewrité:
Code: Tout sélectionner
<?php
list(, $controller, $action, $id) = explode('/', $_SERVER['PATH_INFO']);
 
C'est comme ça que font les principaux CMS.

Encore mieux:
http://upshots.org/php/php-regexrouter
https://gist.github.com/dave1010/1214164
Haut
Messages: 11

Enregistré le: 31 Mai 2016

Message le Mar Mai 31, 2016 14:29

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: Tout sélectionner
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.
Haut
Messages: 8554

Enregistré le: 14 Mai 2003

Message le Mar Mai 31, 2016 15:03

Fait un test:
index.php/foo/bar/baz

Code: Tout sélectionner
<?php
print_r
($_SERVER['PATH_INFO']); 
Haut
Messages: 11

Enregistré le: 31 Mai 2016

Message le Mar Mai 31, 2016 15:50

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 ?
Haut
Messages: 8554

Enregistré le: 14 Mai 2003

Message le Mar Mai 31, 2016 16:17

Voilà exactement, ensuite le rewrite est bcp plus simple que les paramètres en $_GET.
Haut
Messages: 11

Enregistré le: 31 Mai 2016

Message le Mar Mai 31, 2016 16:23

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.
Haut
Messages: 8554

Enregistré le: 14 Mai 2003

Message le Mar Mai 31, 2016 18:50

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.
Haut
Messages: 11

Enregistré le: 31 Mai 2016

Message le Mar Mai 31, 2016 19:32

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
Haut
Messages: 8554

Enregistré le: 14 Mai 2003

Message le Mar Mai 31, 2016 19:46

Cfr. les 2 liens que je t'ai passé dans la 1° réponse, ça permet de "mapper" différents paramètres.
Un 3° pour la route: http://altorouter.com/

MVC c'est aussi un router/dispatcher :)
Haut
Messages: 11

Enregistré le: 31 Mai 2016

Message le Jeu Juin 02, 2016 9:36

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: Tout sélectionner
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.
Haut