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!

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ę


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.


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'];

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.


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)


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"];

1

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

$form->getClientData();


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 ();


-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.


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.