Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/12/2010, 10h04   #1
Membre expérimenté
 
Avatar de bricecol
 
Brice Colucci
Développeur informatique
Inscription : avril 2007
Messages : 357
Détails du profil
Informations personnelles :
Nom : Brice Colucci
Âge : 23

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2007
Messages : 357
Points : 544
Points : 544
Envoyer un message via MSN à bricecol Envoyer un message via Skype™ à bricecol
Par défaut URL rewriting simple

Bonjour,

Bon, jusqu'à présent, j'utilisais des URL du type :
Code :
action?parm1=p1&param2=p2...
Typiquement : site?sid=5

J'aimerais transformer çà en : site/google.fr (en supposant ici que 5 soit l'ID du site google.fr, bref...)

Je me tourne donc sur le fichier monapp/config/routing.yml
Et j'ouvre la doc symfony 1.4.....

Et je n'y arrive toujours pas :p, j'ai besoin d'un petit coup de main SVP

Si je suis la doc, je crois que je dois écrire quelque chose comme :
Code :
1
2
3
site:
  url:   /site/:hostname
  param: { module: sites, action: one }
Vous comprenez je pense, que je cherche à ce que site/google.fr fasse appel à l'action one du module sites en passant en paramètre hostname=google.fr

Est-ce écrit correctement, sinon comment l'écrire ?
Et comment générer la bonne URL dans un contrôleur et dans un template avec url_for() ?

Merci d'avance pour votre aide.
__________________
"Computers are like Old Testament gods ; Lots of rules and no mercy"
[ Les ordinateurs sont comme les dieux de l’Ancien testament ; Beaucoup de règles et aucune pitié. ] Joseph Campbell

Dénoncez les arnaques internet !
Consulter mon C.V. en ligne.
bricecol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 10h25   #2
Membre habitué
 
Avatar de Vicrabb
 
Femme Vinciane
Développeur Web
Inscription : novembre 2010
Messages : 66
Détails du profil
Informations personnelles :
Nom : Femme Vinciane
Âge : 29
Localisation : Belgique

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

Informations forums :
Inscription : novembre 2010
Messages : 66
Points : 100
Points : 100
Est-ce que hostname est bien le nom de la colonne dans lequel ton google.fr est contenu?

Par ailleurs, ce qui se trouve dans param me semble correct.

url_for() se construit ainsi, du moins, dans sa forme simplifiée:
Code :
url_for('nom_de_la_route', 'objet')
Donc par exemple:
Code :
1
2
//dans du html:
<a href="<?php echo url_for('site',$site) ?>">Site</a>
__________________

Symfony par une débutante - Elgg - PHP

Je suis peut-être diplômée en archéologie mais je ne fouille pas le net pour décrypter le langage SMS, pour lire du code sans la balise du même nom..
"The cake is lie" - Doug Rattman, Portal
Vicrabb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 11h50   #3
Membre expérimenté
 
Avatar de bricecol
 
Brice Colucci
Développeur informatique
Inscription : avril 2007
Messages : 357
Détails du profil
Informations personnelles :
Nom : Brice Colucci
Âge : 23

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2007
Messages : 357
Points : 544
Points : 544
Envoyer un message via MSN à bricecol Envoyer un message via Skype™ à bricecol
J'ai beau essayer de plein de manières différentes, je n'y arrive pas...

Voici mes différents essaie, rien n'a marché, il doit sûrement manquer quelque chose...

Mon objet Site a effectivement un attribut hostname

Le routing :
Code :
1
2
3
site:
  url:   /site/:hostname
  param: { module: sites, action: onebyhost }
--------------------------------------------------------
Code :
$this->redirect('site', $site)
Code :
The "/site/:hostname" route has some missing mandatory parameters (:hostname).
--------------------------------------------------------
Code :
$this->redirect('@site', $site)
Code :
The route "@site" does not exist.
--------------------------------------------------------
Code :
$this->redirect('site', array('hostname' => $site->hostname))
Code :
Empty module and/or action after parsing the URL "/site/google.com" (/).
__________________
"Computers are like Old Testament gods ; Lots of rules and no mercy"
[ Les ordinateurs sont comme les dieux de l’Ancien testament ; Beaucoup de règles et aucune pitié. ] Joseph Campbell

Dénoncez les arnaques internet !
Consulter mon C.V. en ligne.
bricecol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 12h04   #4
Membre habitué
 
Avatar de Vicrabb
 
Femme Vinciane
Développeur Web
Inscription : novembre 2010
Messages : 66
Détails du profil
Informations personnelles :
Nom : Femme Vinciane
Âge : 29
Localisation : Belgique

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

Informations forums :
Inscription : novembre 2010
Messages : 66
Points : 100
Points : 100
Attention, ce n'est $site->hostname qui permet de récupérer le hostname mais

Essaie un peu de le rajouter dans tes redirections.
__________________

Symfony par une débutante - Elgg - PHP

Je suis peut-être diplômée en archéologie mais je ne fouille pas le net pour décrypter le langage SMS, pour lire du code sans la balise du même nom..
"The cake is lie" - Doug Rattman, Portal
Vicrabb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 13h12   #5
Membre expérimenté
 
Avatar de bricecol
 
Brice Colucci
Développeur informatique
Inscription : avril 2007
Messages : 357
Détails du profil
Informations personnelles :
Nom : Brice Colucci
Âge : 23

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2007
Messages : 357
Points : 544
Points : 544
Envoyer un message via MSN à bricecol Envoyer un message via Skype™ à bricecol
Non, ->hostname et getHostname(), c'est pareil je pense, en tout cas çà renvoie pareil.

J'ai réussi à faire une URL sous la forme :
Code :
http://.../sites/scorecard/google.com
Au lieu de se que je souhaiterais :
Code :
http://.../site/google.com
En fait, je ne peux pas supprimer l'action de l'URL, ni renommer le module, le matching ne se fait pas sinon.

Si quelqu'un sait comment faire...
__________________
"Computers are like Old Testament gods ; Lots of rules and no mercy"
[ Les ordinateurs sont comme les dieux de l’Ancien testament ; Beaucoup de règles et aucune pitié. ] Joseph Campbell

Dénoncez les arnaques internet !
Consulter mon C.V. en ligne.
bricecol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 14h04   #6
Membre éclairé
 
Inscription : août 2007
Messages : 360
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 360
Points : 334
Points : 334
Bonjour Brice,

Selon la documentation officielle http://www.symfony-project.org/api/1...ethod_redirect, les 2eme paramètre est le code HTTP.

Pourquoi ne pas tenter ça :

Code :
1
2
 
$this->redirect('@site?hostname'.$site);
Pas eu le temps de tester cependant...

Mathieu
mathieu44800 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 14h37   #7
Membre expérimenté
 
Avatar de bricecol
 
Brice Colucci
Développeur informatique
Inscription : avril 2007
Messages : 357
Détails du profil
Informations personnelles :
Nom : Brice Colucci
Âge : 23

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2007
Messages : 357
Points : 544
Points : 544
Envoyer un message via MSN à bricecol Envoyer un message via Skype™ à bricecol
Citation:
Selon la documentation officielle http://www.symfony-project.org/api/1...ethod_redirect, les 2eme paramètre est le code HTTP.
Oui effectivement, c'était pour simplifier, en fait j'utilise (route, params) :
Code :
$this->redirect($this->getController()->genUrl(..., ...))
Le redirect, par ailleurs, ne prend pas les noms de routes comme @uneroute. C'est url_for() ou link_to qui le font, dans les templates.

J'ai réussi à avoir une URL de la forme :
Code :
http://.../sites/scorecard/hostname/google.com
Qui corresponds à :
Code :
1
2
3
scorecard:
  url:   /sites/scorecard/:hostname
  param: { module: sites, action: scorecard }
Voilà comment je construis l'URL :
Code :
$this->redirect($this->getController()->genUrl('sites/scorecard?hostname='.$result['found']->getVeryShortHostname()));
L'URL fonctionne, l'action scorecard du module sites est bien appelée et je récupère le paramètre hostname avec $request->getParameter('hostname').

Ce que j'aimerais c'est avoir le même fonctionnement mais avec une URL du style :
Code :
http://.../site/google.com
Est-possible ?
__________________
"Computers are like Old Testament gods ; Lots of rules and no mercy"
[ Les ordinateurs sont comme les dieux de l’Ancien testament ; Beaucoup de règles et aucune pitié. ] Joseph Campbell

Dénoncez les arnaques internet !
Consulter mon C.V. en ligne.
bricecol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 14h53   #8
Membre éclairé
 
Inscription : août 2007
Messages : 360
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 360
Points : 334
Points : 334
est ce que tu peux afficher ce que te renvoies un :

Code :
 var_dump($this->getController()->genUrl(..., ...));
mathieu44800 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 15h20   #9
Membre expérimenté
 
Avatar de bricecol
 
Brice Colucci
Développeur informatique
Inscription : avril 2007
Messages : 357
Détails du profil
Informations personnelles :
Nom : Brice Colucci
Âge : 23

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2007
Messages : 357
Points : 544
Points : 544
Envoyer un message via MSN à bricecol Envoyer un message via Skype™ à bricecol
Code :
http://.../sites/scorecard/hostname/google.com
__________________
"Computers are like Old Testament gods ; Lots of rules and no mercy"
[ Les ordinateurs sont comme les dieux de l’Ancien testament ; Beaucoup de règles et aucune pitié. ] Joseph Campbell

Dénoncez les arnaques internet !
Consulter mon C.V. en ligne.
bricecol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 15h24   #10
Membre éclairé
 
Inscription : août 2007
Messages : 360
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 360
Points : 334
Points : 334
Je pense que tes URLs dans ton routing se croisent.

Essayes de commenter ta route @scorecard dans ton routing et de faire une redirection simple :

Code :
1
2
 
$this->redirect('@site?hostname='.$site);
J'espère que j'aurais pu t'aider...
mathieu44800 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2010, 20h45   #11
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Puis-je me permettre de jeter mon grain, de sel, sur la route ?

L'idée est bonne et les conseils judicieux mais il n'y a pas une grosses erreurs ici, mais plusieurs petites, et il faudra toutes les corriger pour arriver à faire marcher la chose.

Pour la route, je ne suis pas très sur qu'envoyer une url ainsi, dans le chemin soit une très bonne idée, notamment à cause des "/" qui pourraient s'y trouver et perturber notablement le moteur de route de symfony. Je serais plutôt partisan de partir du nom du site slugifier. Doctrine introduit des outils permettant de générer facilement un slug unique pour chaque enregistrement. Il est aussi possible de slugifier l'url.

Pour la route ta déclaration :
Code :
1
2
3
4
 
scorecard:
  url:   /sites/scorecard/:hostname
  param: { module: sites, action: scorecard }
est correcte, même si l'url pourrait être allégée, il n'est en rien indispensable qu'elle ressemble au module + action, vu qu'ils sont indiqué dans les paramètres.

Pour que cela marche il faut appeler ta route de la manière suivante :
Code :
1
2
 
url_for('@scorecard?hostname=' . $site->getHostname() );
Tu récupère alors dans le module sites par
Code :
1
2
3
4
5
6
7
 
public function executeScorecard(sfWebRequest $request)
{
   ...
   $urm = $request->getParameter('hostname');
   ...
}
A noter que tu as aussi la possibilité d'utiliser des routes doctrine qui peuvent apporter beaucoup en terme de développement. Je t'invite à générer un module CRUD non admin et a en regarder le code, tu trouveras largement de quoi t'inspirer.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2010, 11h36   #12
Membre habitué
 
Homme Ludovic Henry
Étudiant
Inscription : octobre 2009
Messages : 97
Détails du profil
Informations personnelles :
Nom : Homme Ludovic Henry
Âge : 20
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2009
Messages : 97
Points : 105
Points : 105
Par contre, il y a une erreur dans la déclaration de ta route. Si tu veut utiliser la chose suivante :
Il faut que ta route utilise une sfDoctrineRoute ( si tu utilise l'ORM Doctrine )

Donc ta route doit être de la forme:
Code :
1
2
3
4
5
6
 
site:
  url: /site/:hostname
  class: sfDoctrineRoute
  options: { model: ModelDeTonSite, type: object, method_for_query: retrieveRouteObject } // method_for_query est optionnel mais utile si tu veut réaliser des JOIN, des WHERE, ....
  param: { module: sites, action: onebyhost }
Par contre un des "désavantages" de cette méthode est que tu ne peut avoir que des requetes HTTP GET. Donc tu neut peut pas l'utiliser pour des formulaires, où la requete HTTP est POST.
Inarius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2010, 19h35   #13
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Citation:
Envoyé par Inarius Voir le message
Par contre un des "désavantages" de cette méthode est que tu ne peut avoir que des requetes HTTP GET. Donc tu neut peut pas l'utiliser pour des formulaires, où la requete HTTP est POST.
Ca marche aussi avec des requêtes de type POST. Heureusement, c'est ce qui est utilisé dans le CRUD généré par symfony et doctrine

En fait, cela marche même avec des requêtes PUT et autres.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/12/2010, 09h56   #14
Membre du Club
 
Étudiant
Inscription : décembre 2007
Messages : 44
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2007
Messages : 44
Points : 45
Points : 45
Envoyer un message via MSN à Taka-kun
Court et assez bien fait :
http://www.symfony-project.org/jobee...Doctrine/fr/05
Taka-kun est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h20.


 
 
 
 
Partenaires

Hébergement Web