Uzyskaj dostęp do wartości POST w obiekcie żądania Symfony2

93

OK, to jest pytanie dla początkujących, ale nigdzie nie mogę znaleźć odpowiedzi. W kontrolerze w Symfony2 chcę uzyskać dostęp do wartości POST z jednego z moich formularzy. W kontrolerze mam:

public function indexAction()
{ 
    $request = $this->get('request');
    if ($request->getMethod() == 'POST') {
        $form = $this->get('form.factory')->create(new ContactType());
        $form->bindRequest($request);
        if ($form->isValid()) {
            $name_value = $request->request->get('name');

Niestety $name_valuenic nie zwraca. Co ja robię źle? Dzięki!

Acyra
źródło

Odpowiedzi:

99

Symfony 2.2

to rozwiązanie jest przestarzałe od wersji 2.3 i zostanie usunięte w wersji 3.0, zobacz dokumentację

$form->getData();

daje tablicę dla parametrów formularza

z książki symfony2 strona 162 (Rozdział 12: Formularze)

[...] czasami możesz po prostu użyć formularza bez klasy i odzyskać tablicę przesłanych danych. To jest naprawdę proste:

public function contactAction(Request $request) {
  $defaultData = array('message' => 'Type your message here');
  $form = $this->createFormBuilder($defaultData)
  ->add('name', 'text')
  ->add('email', 'email')
  ->add('message', 'textarea')
  ->getForm();
  if ($request->getMethod() == 'POST') {
    $form->bindRequest($request);
    // data is an array with "name", "email", and "message" keys
    $data = $form->getData();
  }
  // ... render the form
}

Możesz również uzyskać dostęp do wartości POST (w tym przypadku „name”) bezpośrednio przez obiekt żądania, na przykład:

$this->get('request')->request->get('name');

Należy jednak pamiętać, że w większości przypadków użycie metody getData () jest lepszym wyborem, ponieważ zwraca ona dane (zwykle obiekt) po ich przekształceniu przez framework formularza.

Jeśli chcesz uzyskać dostęp do tokena formularza, musisz użyć odpowiedzi Problematic, $postData = $request->request->get('contact');ponieważ getData()usuwa element z tablicy


Symfony 2.3

od wersji 2.3 powinieneś używać handleRequestzamiast bindRequest:

 $form->handleRequest($request);

zobacz dokumentację

timaschew
źródło
4
To świetnie, a teraz jest najlepsza odpowiedź. $ form-> getData () nie istniało lub nie było udokumentowane, kiedy zadawałem pytanie.
Acyra
4
aby powiązać dane żądania z formularzem w najnowszych wersjach, należy użyć $ form-> handleRequest ($ request); zamiast $ form-> submit ($ request); Myślę. Więcej szczegółów symfony.com/doc/2.3/book/forms.html#handling-form-submissions
adridev
127

Wartości postów formularza są przechowywane pod nazwą formularza w żądaniu. Na przykład, jeśli nadpisałeś getName()metodę ContactType (), aby zwracała „kontakt”, zrobiłbyś to:

$postData = $request->request->get('contact');
$name_value = $postData['name'];

Jeśli nadal występują problemy, spróbuj robi var_dump()na $request->request->all()zobaczyć wszystkie wartości pocztowych.

Problematyczny
źródło
2
Dziękuję Ci. Var_dump pomógł, skończyło się to atakuje z pełną nazwą odzyskać dane formularza np $ postData = $ request-> request-> get ( „acme_somebundle_contact_type”)
Acyra
1
Zobacz odpowiedź z timaschew poniżej, ponieważ zostało to zadane, Symfony2 dodał nową metodę: $ form-> getData ();
Acyra
2
Jeśli nadpisałeś getName(), to nie ma sensu zakodować nazw na stałe:$request->request->get($form->getName());
meze
Dziękuję .. Zaoszczędziłem dużo czasu :) Pozdrawiam !!
Anjana Silva
38

to, co zadziałało, to używanie tego:

$data = $request->request->all();
$name = $data['form']['name'];
ramzey
źródło
O tym właśnie wspomniał Problematic, + zobacz komentarz @meze tam
phpsherpa
17

Jest jedna sztuczka z ParameterBag::get()metodą. Można ustawić $deepparametr do truei dostępu do wymaganej wartości głęboko zagnieżdżonych bez dodatkowej zmiennej:

$request->request->get('form[some][deep][data]', null, true);

Masz również możliwość ustawienia wartości domyślnej (drugi parametr get()metody), co pozwala uniknąć zbędnego isset($form['some']['deep']['data'])wywołania.

Dmitriy
źródło
Trzeci parametr został wycofany i usunięty z wersji 3.0. Uwaga: znajdowanie głębokich elementów jest przestarzałe od wersji 2.8, a zostanie usunięte w 3.0. : github.com/symfony/symfony/blob/…
AL
8

Dostęp do danych pola można uzyskać w kontrolerze za pomocą: Listingu 12-34

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

Ponadto dane niezmapowanego pola można również bezpośrednio modyfikować: Listing 12-35

$form->get('dueDate')->setData(new \DateTime());

strona 164 książka symfony2 (wygenerowana 9 października 2013)

meteor
źródło
7

Uzyskuję dostęp do parametru ticketNumber dla mojego wieloczęściowego żądania pocztowego w następujący sposób.

$data = $request->request->all();
$ticketNumber = $data["ticketNumber"];
Ilker Baltaci
źródło
1

Myślę, że aby uzyskać dane zapytania, powiązane i zatwierdzone przez obiekt formularza, należy użyć:

$form->getClientData();

Chicna
źródło
7
getClientData jest przestarzałe. Użyj getData, getViewData, getNormData .... Komponent Form jest naprawdę nieuporządkowany w SF2 (naprawdę powinien zainspirować się światem Java i fajnym RequestDataBinder ....)
Thomas Decaux
0

Symfony doc aby uzyskać dane żądania

Wreszcie, do surowych danych wysłanych z treścią żądania można uzyskać dostęp za pomocą metody getContent ():

$ content = $ request-> getContent ();

Alex Joe
źródło
-14

Jeśli jesteś nowicjuszem, witaj w Symfony2, projekcie open source, więc jeśli chcesz się dużo nauczyć, możesz otworzyć źródło!

Z „Form.php”:

getData () getNormData () getViewData ()

Więcej szczegółów znajdziesz w tym pliku.

Thomas Decaux
źródło
Zawsze używaj sposobu Symfony, $ _POST, $ request jest brudny
Thomas Decaux,
Tak, nie nadaję się do wyjaśniania ^^, ale jest to dokładnie to samo rozwiązanie, co potwierdzone. $form->getData();Wiem, że ludzie są leniwi i chcą rozwiązania bez zastanowienia ;-(
Thomas Decaux,