IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

recupérer dans l' action un paramètre de l' url [1.x]


Sujet :

Symfony PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 212
    Points : 108
    Points
    108
    Par défaut recupérer dans l' action un paramètre de l' url
    Bonjour,

    Nouveau défi.

    Protéger un formulaire par un token stocké en base.

    Une invitation est envoyé par e-mail contenant le lien du formulaire incluant un token chaque fois différent.

    Aprés avoir modifié le routing.yml, j' envoi donc des urls de type:

    frontend_dev.php/evaluation/index/284a46a51a56859871278a651df4721b

    Ensuite j' essai de récupérer le token pour vérifier son existence en base, en me servant de la tool bar et de l' api.

    J' essai de faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public function executeIndex(sfWebRequest $request)
      {
     
         $this->token = $sf_request->sfParameterHolder();
         $this->invitation =   Doctrine_Core::getTable('Invitation')->getToken($this->token);
    Mais j' obtiens un joli:
    Notice: Undefined variable: sf_request
    Fatal error: Call to a member function sfParameterHolder()

  2. #2
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    On va supposer que ta route est sous la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    # apps/<application>/config/routing.yml
     
    action_token:
      url: /evaluation/index/:token
      param:
        module: MonModuleName
        action: index
     
    ...
    Le code de l'action sera alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // apps/<application>/modules/MonModuleName/actions/actions.class.php
     
    public function executeIndex(sfWebRequest $request)
    {
       $this->forward404until($this->invitation = $request->getParameter('token', )null);
    }
    Le paramètre récupéré au lancement de l'action est justement le résultat du request envoyé avec tous les paramètres. Le fait de le faire dans un forward404 permet de vérifier que le paramètre est renseigné, si non, il renvoie sur une page d'erreur 404. Il faudra encore faire le même traitement sur le token et sa durée de validation.

    On peut aussi, peut-être, envisager de ce servir d'une DoctrineRoute, qui s'occupera de la vérification de l'existence du token dans la table (mais pas de la pertinence de la date)(quoique, a étudier...) dans ce cas, on serait ainsi sur de l'existence du l'enregistrement d'invitation, sans avoir à mettre une ligne de code dans l'action (ce qui n'empêche que la vérification de la date se fera dans le modèle, donc, il reste bien du code à créer).

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 212
    Points : 108
    Points
    108
    Par défaut
    Oui mais j' ai besoin de savoir si le token existe dans la base

    Au passage ton code me génère ceci..

    500 | Internal Server Error | sfException
    Call to undefined method evaluationActions::forward404until.


    Pour la route j' avais trouve ceci qui me semblait intéressant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    evaluation:
      url:  /evaluation
      param: { module: evaluation, action: index }
      class:        sfDoctrineRouteCollection
      options:      { model: Invitation, column: token }
      requirements: { token: \w+ }

  4. #4
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Oui mais j' ai besoin de savoir si le token existe dans la base
    Je n'ai jamais dis autre chose... au contraire.

    Au passage ton code me génère ceci..
    --> forward404Unless()

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 212
    Points : 108
    Points
    108
    Par défaut
    C 'est mieux.. .

    Mais quelque soit le token passé dans l' url mon formulaire s' affiche..

    Ce qui m' étonne qu' a moitié vu que je ne fais aucune requete dans la table invitation pour vérifier.

    d' ou mon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $this->invitation = Doctrine_Core::getTable('Invitation')->getToken($this->token);

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 212
    Points : 108
    Points
    108
    Par défaut
    En fait pourquoi faire compliquer si on passe le paramètre token comme ceci,

    .......evaluation/index/?token=284a46a51a56859871278a651df4721b

    On peut le récupérer comme ceci..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $this->token = $request->getParameter('token');
    Par contre, chez moi ceci n' a aucun effet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $this->forward404Unless($this->token = $request->getParameter('token'),null);

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 28
    Points : 31
    Points
    31
    Par défaut
    essaie plutôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->forward404Unless($this->token = $request->getParameter('token'));

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 212
    Points : 108
    Points
    108
    Par défaut
    Cela ne change rien.. meme si je passe aucun token , je ne suis pas redirigé vers une 404.

    Ma requete sql semble être effectuée mais pas stocké dans le bon objet.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 28
    Points : 31
    Points
    31
    Par défaut
    Tu utilise quelle route?

    Sinon avec la route qui tu as donnée plutot, j'aurai plutot fait comme ça

    Code routing.yml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    evaluation:
      url:  /evaluation/:token
      param: { module: evaluation, action: index }
      class:        sfDoctrineRoute
      options:      { model: Invitation, type: object}
      requirements: { token: \w+ }

    Puis dans ton code tu peux faire ainsi après :
    Code action.class.php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
      public function index(sfWebRequest $request) {
        $this->invitation = $this->getRoute()->getObject(); // Tu aura l'objet invitation
      }
    ...

    Normalement pas besoin de forward404unless car il va checker tout seul si le token existe!

    cf: la doc http://www.symfony-project.org/jobee...se_de_la_route

    ps: sur la documentation de symfony, le jobeet montre comment mettre en place un système de token assez simple mais qui marche très bien!

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 212
    Points : 108
    Points
    108
    Par défaut
    Oui mais je me suis d' ailleuurs inspiré de cela.

    Dans mon cas les token sont gérés dans une autre table puis envoyé par mail aux personnes concerné.

    Si le token est valide, le formulaire s' affiche en récupérant au passage qui est concerné ( l' évalué et celui qui évalue..).



    Mais quand j' essai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     $this->invitation = $this->getRoute()->getObject();

    j' obtiens un jolie

    Call to undefined method sfRoute::getObject()

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 28
    Points : 31
    Points
    31
    Par défaut
    Tu utilise quelle version de symfony?

    Normalement le code que j'ai mis marche, du moins pour ma part j'utilise beaucoup les routing avancés

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 212
    Points : 108
    Points
    108
    Par défaut
    1.4.8...

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 212
    Points : 108
    Points
    108
    Par défaut
    En fait c' était bete comme choux !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this->token = $request->getParameter('token');
    avec un ?token=<chaine> dans l' url. .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recupération de paramètre URL dans l'action
    Par jamesleouf dans le forum Struts 1
    Réponses: 1
    Dernier message: 14/04/2010, 21h19
  2. Réponses: 9
    Dernier message: 05/11/2008, 22h26
  3. [1.x] select_tag : recupérer les choix dans l'action
    Par Giovanny Temgoua dans le forum Symfony
    Réponses: 4
    Dernier message: 08/09/2008, 15h16
  4. Réponses: 3
    Dernier message: 30/07/2004, 11h51
  5. [JSP] [STRUTS] Switch dans une action
    Par babylone7 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 28/07/2004, 16h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo