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 :

Perte des données lors d'une requête POST à partir du client du WebTestCase [3.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de crozet.magenta
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2012
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 208
    Par défaut Perte des données lors d'une requête POST à partir du client du WebTestCase
    Bonjour,
    Je développe actuellement une appli avec symfony. après la phase de tests unitaires, j'en suis à la phase de tests fonctionnels, toujours avec Phpunit et le WebTestCase de Symfony.
    Alors que tout fonctionne bien en faisant les tests dans le navigateur, je n'arrive pas à tester mes formulaires (et toutes mes requêtes POST) car les données envoyées ne sont pas reçues par mon contrôleur...

    Voici le code de mon test :
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <?php
     
    use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
     
     
    class TokenControllerTest extends WebTestCase
    {
        public function testIndex()
        {
            $client = static::createClient();
            $crawler = $client->request('GET', '/token');
     
     
            $this->assertContains('Token list', $crawler->html());
            $this->assertContains('Create token', $crawler->html());
        }
     
     
        public function testGenerateToken()
        {
            $client = static::createClient();
            $client->request('POST', '/token/generate', [
                'allCommands' => true
            ]);
     
            var_dump($client->getRequest()->request);
     
            $this->assertTrue($client->getResponse()->isSuccessful());
        }
    }

    le test testIndex() passe avec succès mais le testGenerateToken() est en erreur car le controleur ne reçoit pas de donnée POST et il renvoie donc une erreur 500.
    j'ai essayé diverses méthodes pour envoyer ma requête POST (get sur la page du formulaire puis remplir le formulaire et faire un submit, passer les données du formulaire dans la fonction submit) et j'ai dans tous les cas la même erreur...

    Voici les dumps de la requête envoyée par le web test case et le dump de la requête reçue par le controleur :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    // dans le test : 
    var_dump($client->getRequest()->request);
    /*
    object(Symfony\Component\HttpFoundation\ParameterBag)#618 (1) {
      ["parameters":protected]=>
      array(1) {
        ["allCommands"]=>
        bool(true)
      }
    }
    */
     
    //=============//
    // dans le controleur
    $request = Request::createFromGlobals();
    var_dump($request->request);
    /*
    object(Symfony\Component\HttpFoundation\ParameterBag)#647 (1) {
      ["parameters":protected]=>
      array(0) {
      }
    }
    */

    les données POST sont donc bien envoyées par le client de test mais le controleur ne reçoit rien...
    j'ai également essayé de poster le formulaire en utilisant le navigateur en environnement de test et tout fonctionne correctement, ce n'est donc pas à priori un priblème de configuration de l'environnement d'exécution.

    Est-ce que quelqu'un a une idée de comment résoudre le problème ?

  2. #2
    Membre extrêmement actif
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Par défaut
    un problème de routing ?
    l'action du formulaire de test pointe bien au bon endroit ?

    avec le profil Symfony on peut voir ça vite fait

  3. #3
    Membre expérimenté
    Avatar de crozet.magenta
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2012
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 208
    Par défaut
    en regardant les logs, j'ai bien la bonne route :
    request.INFO: Matched route "auth_token_generate". {"route":"auth_token_generate","route_parameters":{"_controller":"AuthBundle\\Controller\\TokenController::generateAction","_route":"auth_token_generate"},"request_uri":"http://localhost/token/generate","method":"POST"} []

  4. #4
    Membre expérimenté
    Avatar de crozet.magenta
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2012
    Messages
    208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2012
    Messages : 208
    Par défaut
    J'ai finalement résolu le problème !

    en explorant le code source d'autres bundles, j'ai constaté que peu de gens utilisent $request = Request::createFromGlobals() dans le controleur, la plupart du temps, l'objet request est passé en paramètre de l'action du controleur.
    En définissant mon action comme ceci public function generateTokenAction(Request $request){}, le problème est résolu, le controleur reçoit bien les données de la requete POST.

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

Discussions similaires

  1. [SP-2007] pertes des parametres lors d'une creation de site avec modele
    Par padej450 dans le forum SharePoint
    Réponses: 1
    Dernier message: 04/06/2009, 14h49
  2. Réponses: 2
    Dernier message: 31/05/2007, 10h57
  3. [FPDF] Mettre des données issues d'une requête dans l'entête
    Par zoom61 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 30/03/2007, 10h10
  4. [MySQL] Perte d'information lors d'une requête de visualisation
    Par niccco dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 21/10/2005, 13h46

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