web-dev-qa-db-fra.com

Comment obtenir des valeurs de formulaire dans le contrôleur Symfony2

J'utilise un formulaire de connexion sur Symfony2 avec le code de contrôleur suivant

public function loginAction(Request $request)
{
    $user = new SiteUser();
    $form = $this->createForm(new LoginType(), $user);


    if ($request->getMethod() == 'POST') {
        $form->bindRequest($request);
        $data = $form->getValues();
        // Need to do something with the data here
    }

    return $this->render('GDSiteBundle::header.html.twig', array('form' => $form->createView()));
}

Mais je reçois l'avertissement suivant:

Avertissement: array_replace_recursive () [function.array-replace-recursive]: L'argument n ° 1 n'est pas un tableau dans la ligne 593. 500 Erreur interne du serveur - ErreurException

Est-ce que quelqu'un peut m'aider à comprendre ce qui est incorrect et comment je peux le réparer? Merci.

Mise à jour: Le fichier twig ressemble à ceci:

<div class="form">
    {{ form_errors(form) }}
    <form action="{{ path('site_user_login') }}" method="POST" {{ form_enctype(form) }}>
        <div class="level1">
            {{ form_row(form.username) }}
            <a href="javascript:void(0)" id="inscription">{% trans %}Registration{% endtrans %}</a>
        </div>
        <div class="level2">
            {{ form_row(form.pwd_hash) }}
            <div class="forget_pass"><a href="#" id="frgt">{% trans %}Forgot Password ?{% endtrans %}</a></div>
        </div>
        <input type="submit" class="submit" name="login" value/>
        <div class="clr"></div>
    </form>
</div>

Voici la fonction dans le type du formulaire

public function buildForm(FormBuilder $builder, array $options)
{
    $builder->add('username', 'text', array('label' => 'Username : '));
    $builder->add('pwd_hash','password', array('label' => 'Password : '));
}

Voici l'itinéraire:

site_user_login:
    pattern: /{_locale}/login
    defaults: {_controller: GDSiteBundle:SiteUser:login}
76
VishwaKumar

Simplement:

$data = $form->getData();
90
Hubert Perron

Aucun de ce qui précède n'a fonctionné pour moi. Cela fonctionne pour moi:

$username = $form["username"]->getData();
$password = $form["password"]->getData();

J'espère que ça aide.

90
pkout

Dans Symfony 2 (pour être plus spécifique, la version 2.3), vous pouvez obtenir les données d’un champ en

$var = $form->get('yourformfieldname')->getData();

ou vous pouvez obtenir toutes les données envoyées

$data = $form->getData();

où '$ data' est un tableau contenant les valeurs de vos champs de formulaire.

56
albert

Dans Symfony> = 2.3, vous pouvez obtenir la valeur de champs simples avec:

$var = $form->get('yourformfieldname')->getData();

D'autre part, vous pouvez utiliser:

$data = $form->getData();

MAIScela vous donnerait deux choses différentes:

  • l'entité avec les valeurs renseignées par le formulaire, si l'option data-class est activée dans votre formulaire (il est donc lié à une entité) ce sera exclure tout champ avec l'option 'mapping' => false

  • sinon, un tableau avec tous les champs du formulaire

20
Jean

Si vous avez des champs supplémentaires dans le formulaire qui ne sont pas définis dans Entity, $form->getData() ne fonctionne pas, une solution pourrait être la suivante:

$request->get("form")["foo"] 

Ou :

$form->get('foo')->getData();
15
Saman Mohamadi

Dans Symfony formulaires , il existe deux types différents de transformateurs et trois types différents de données sous-jacentes: enter image description here Quelle que soit leur forme, les trois types de données sont:

  • Données du modèle

    Il s’agit des données au format utilisé dans votre application (par exemple, un objet Issue). Si vous appelez Form::getData() ou Form::setData(), vous traitez avec les données "modèles".

  • Données de données

    Ceci est une version normalisée de vos données et correspond généralement aux données de votre "modèle" (mais pas dans notre exemple). Ce n'est pas couramment utilisé directement.

  • Voir les données

    C'est le format utilisé pour remplir les champs du formulaire eux-mêmes. C'est également le format dans lequel l'utilisateur soumettra les données. Lorsque vous appelez Form::submit($data), les données $ sont au format de données "view".

Les deux types de transformateurs permettent de convertir vers et à partir de chacun de ces types de données:

  • Transformateurs de modèle:

    transform(): "model data" => "norm data"
    reverseTransform(): "norm data" => "données de modèle"

  • View transformers:

    transform(): "norm data" => "view data"
    reverseTransform(): "view data" => "norm data"

Le transformateur dont vous avez besoin dépend de votre situation.

Pour utiliser le transformateur de vue, appelez addViewTransformer().


Si vous souhaitez obtenir toutes les données de formulaire:

$form->getData();

Si vous recherchez un champ de formulaire spécifique (par exemple first_name):

$form->get('first_name')->getData();
5
Trix

Je l'ai eu en travaillant par ceci:

if ($request->getMethod() == 'POST') {
    $username = $request->request->get('username');
    $password = $request->request->get('password');

    // Do something with the post data
}

Vous devez également avoir la requête Request $ request en tant que paramètre dans la fonction!.

4
VishwaKumar

Je pense que pour obtenir les données de la demande, liées et validées par l'objet de formulaire, vous devez utiliser cette commande:

$form->getViewData();
$form->getClientData(); // Deprecated since version 2.1, to be removed in 2.3.
4
Chicna
private function getFormDataArray($form)
{
    $data = [];
    foreach ( $form as $key => $value) {
        $data[$key] = $value->getData();
    }
    return $data;
}
3
viciouskinid

Si vous utilisez Symfony 2 security management, vous n’avez pas besoin d’obtenir des valeurs publiées, vous devez seulement gérer le modèle de formulaire (voir documentation ).

Si vous n'utilisez pas la gestion de la sécurité Symfony 2, je vous conseille vivement de l'utiliser. Si vous ne le souhaitez pas ou si vous ne le pouvez pas, pouvez-vous nous donner les sources de LoginType?

2
BlackCharly

Pour obtenir les données d'un champ spécifique,

$form->get('fieldName')->getData();

Ou pour toutes les données de formulaire

$form->getData();

Lien vers docs: https://symfony.com/doc/2.7/forms.html

0
PJately

Pour les champs de formulaire non mappés, j'utilise $ form-> get ('inputName') -> getViewData ();

0
Strabek