Jak uzyskać parametry żądania w symfony2


203

Jestem bardzo nowy w symfony. W innych językach, takich jak Java i innych, których mogę użyć, request.getParameter('parmeter name')aby uzyskać wartość.

Czy jest coś podobnego, co możemy zrobić z symfony2.
Widziałem kilka przykładów, ale żaden nie działa dla mnie. Załóżmy, że mam pole formularza o nazwie nazwa użytkownika . W akcji formularza próbowałem użyć czegoś takiego:

$request = $this->getRequest();
$username= $request->request->get('username'); 

Próbowałem też

$username = $request->getParameter('username');

i

$username=$request->request->getParameter('username');

Ale żadna z opcji nie działa, jednak następujące działały dobrze:

foreach($request->request->all() as $req){
    print_r($req['username']);
}

Gdzie robię źle stosując getParameter()metodę. Każda pomoc będzie mile widziana.


Masz literówkę w drugim wierszu: $request->request-get()powinno być $request->request->get(). Czy to możliwe?
halfer

napisałem to samo w kodzie. wyszedłem tutaj. przepraszam za literówką tutaj. nadal to nie działa.
Abdul Hamid

Czy (a) sprawdziłeś instrukcję, aby upewnić się, że get()jest to poprawna metoda i (b) włączyłeś powiadomienia PHP, abyś mógł zobaczyć, czy są jakieś problemy? (c) Czy Symfony 2 ma pasek narzędzi do debugowania, taki jak Symfony 1, więc możesz sprawdzić, czy popełniłeś jakieś błędy?
halfer

Czy mylisz imię i nazwę użytkownika?
greg0ire,

Odpowiedzi:


416

Nazewnictwo nie jest aż tak intuicyjne:

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request)
{
    // $_GET parameters
    $request->query->get('name');

    // $_POST parameters
    $request->request->get('name');

46
Różni się od tego, z czego korzysta PHP, ale w rzeczywistości ma to większy sens. $_GETdane to dane z ciągu zapytania (w ogóle nie jest GETwymagane żądanie), a $_POSTdane to dane z treści żądania (może to nie być POSTżądanie, może być PUT).
igorw

5
próbował $ request-> query-> get ('name'); ale to też nie działa.
Abdul Hamid

7
Jak uzyskać parametry z żądania PUT?
Tjorriemorrie,

10
Bardzo dziwne nazywanie tutaj, na pewno $request->geti $request->postbyłoby prostsze.
crmpicco

3
komentarz igwora nadaje jasność tej dziwacznej konwencji nazewnictwa
Dheeraj

32

Robię to jeszcze prościej:

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request)
{
    $foo = $request->get('foo');
    $bar = $request->get('bar');
}

Inną opcją jest wprowadzenie parametrów do definicji funkcji akcji:

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request, $foo, $bar)
{
    echo $foo;
    echo $bar;
}

który następnie zakłada, że ​​zdefiniowałeś {foo} i {bar} jako część wzorca adresu URL w pliku routing.yml:

acme_myurl:
    pattern:  /acme/news/{foo}/{bar}
    defaults: { _controller: AcmeBundle:Default:getnews }

a w pierwszym przykładzie, jeśli mam fooparametr zarówno w ciągu zapytania, jak i w treści POST, który zostanie zwrócony przez $request->get('foo')?
Dimitry K

1
Wygląda na to, że priorytetem jest GET, PATH, POST api.symfony.com/master/Symfony/Component/HttpFoundation/…
Dimitry K

To najlepsza odpowiedź
steampowered

7
Nie, nie jest. Dokumentacja samej metody mówi, że odradza się jej stosowanie, ponieważ jest ona cięższa niż dostęp do parametrów GET / POST za pośrednictwem ich konkretnych kolekcji.
jurchiks

1
Odpowiedź jest poprawna $request->get('foo'); dla WSZYSTKICH worków (kolejność to: ŚCIEŻKA, GET, POST). Niemniej jednak $request->request->get('foo');działa tylko w przypadku torby POST. Wreszcie pierwsza ( $request->get()) nie jest zalecana, jeśli wiemy, gdzie są dane (GET / POST).
F2000

18

Możesz użyć następującego kodu, aby uzyskać wartości pól formularza

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request)
{
    // retrieve GET and POST variables respectively
    $request->query->get('foo');
    $request->request->get('bar', 'default value if bar does not exist');
}

Lub Możesz również uzyskać wszystkie wartości formularza jako tablicę za pomocą

$request->request->all()

3
$ request-> request-> all () działa dla mnie, ale coś takiego jak $ request-> query-> get ('foo'); nie działa.
Abdul Hamid

13

próbować

$request->request->get('acme_demobundle_usertype')['username']

sprawdź nazwę atrybutu pola formalnego


1
+1, ponieważ uważam, że ze wszystkich odpowiedzi, tylko ta faktycznie mówi nieoczywistą rzecz - w przypadkach, gdy utworzyłeś formularze automatycznie za pomocą konstruktora formularzy symfony, symfony zmienia nazwę pola formularza na coś więcej niż byś oczekiwać. Like name = "acme_demobundle_userform [nazwa_pola]"
userfuser

Składnia, o której tu wspomniałeś, nie działa z php 5.3.10. Jaka jest minimalna wersja, która to obsługuje?
Justinas Lelys

2
@justinasLelys spróbuj $ userType = $ request-> request-> get ('acme_demobundle_usertype'); $ nazwa użytkownika = $ userType ['nazwa użytkownika'];
sleep-er

@JustinasLelys Składnia to PHP 5.4
COil

„nazwa użytkownika” nie może być zdefiniowana. Więc lepiej sprawdź za pomocą „??” pierwszy.
Viktor Sydorenko

9

Wewnątrz kontrolera:

$request = $this->getRequest();
$username = $request->get('username');

6
W nowszych wersjach Symfony $this->getRequest()jest przestarzały, na korzyść wprowadzenia żądania do działania kontrolera, np .:public function showAction(Request $request, $id);
Adam Elsodaney

9

Twoje opcje:

  1. Prosty:
    • $request->request->get('param')( $_POST['param']) lub
    • $request->query->get('param')( $_GET['param'])
  2. Dobre formularze Symfony ze wszystkimi walidacjami, transformacją wartości i renderowaniem formularzy z błędami i wieloma innymi funkcjami:
  3. Coś pomiędzy (patrz przykład poniżej)
<?php
/**
 * @Route("/customers", name="customers")
 *
 * @param Request $request
 * @return Response
 */
public function index(Request $request)
{
    $optionsResolver = new OptionsResolver();
    $optionsResolver->setDefaults([
        'email' => '',
        'phone' => '',
    ]);
    $filter = $optionsResolver->resolve($request->query->all());

    /** @var CustomerRepository $customerRepository */
    $customerRepository = $this->getDoctrine()->getRepository('AppBundle:Customer');

    /** @var Customer[] $customers */
    $customers = $customerRepository->findFilteredCustomers($filter);

    return $this->render(':customers:index.html.twig', [
        'customers' => $customers,
        'filter' => $filter,
    ]);
}

Więcej informacji OptionsResolver- http://symfony.com/doc/current/components/options_resolver.html


8

Ponieważ teraz $this->getRequest()metoda jest przestarzała, musisz wstrzyknąć Requestobiekt do akcji kontrolera w następujący sposób:

public function someAction(Request $request)

po tym możesz użyć jednego z poniższych.

Jeśli chcesz pobrać dane POST z żądania, wykonaj następujące czynności:

$request->request->get('var_name');

ale jeśli chcesz pobrać dane GET z żądania, użyj tego:

$request->query->get('var_name');

6

Możesz to zrobić:

$clientName = $request->request->get('appbundle_client')['clientName'];

Czasami, gdy atrybuty są chronione, nie można uzyskać dostępu, aby uzyskać wartość dla wspólnej metody dostępu:

(POCZTA)

 $clientName = $request->request->get('clientName');

(DOSTAĆ)

$clientName = $request->query->get('clientName');

(OGÓLNY)

$clientName = $request->get('clientName');

1
Witamy w Stack Overflow. Sformatuj swoją odpowiedź, aby następnym razem była bardziej czytelna, a także sprawdź tę stronę pomocy: Jak odpowiedzieć
Fabian Horlacher,

co jeśli po otrzymaniu jest 2 wartość? jak to$clientName = $request->query->get('clientName','any');
Munkhdelger Tumenbayar

3

Większość przypadków, takich jak uzyskanie ciągu zapytania lub parametrów formularza, jest omówiona w odpowiedziach powyżej.

Podczas pracy z surowymi danymi, takimi jak nieprzetworzony ciąg JSON w ciele, który chcesz podać jako argument json_decode(), Request::getContent()można zastosować metodę

$content = $request->getContent();

Dodatkowe przydatne informacje na temat żądań HTTP w Symfony można znaleźć w dokumentacji pakietu HttpFoundation .


1
$request = Request::createFromGlobals();
$getParameter = $request->get('getParameter');

Czy to wciąż droga do funkcji, które nie mają Requestparametru? (np. w prywatnych funkcjach klasy kontrolera na przykład)
fritzmg

1
use Symfony\Component\HttpFoundation\Request;

public function indexAction(Request $request, $id) {

    $post = $request->request->all();

    $request->request->get('username');

}

Dzięki, możesz również użyć powyższego kodu


0

Jeśli potrzebujesz uzyskać wartość z wyboru, możesz użyć:

$form->get('nameSelect')->getClientData();

0

Spróbuj tego, to działa

$this->request = $this->container->get('request_stack')->getCurrentRequest();

pozdrowienia


To w ogóle nie odpowiada na pytanie. Osoba zadająca pytanie ma już dostęp do obiektu żądania.
Layton Everson,

1
@LaytonEverson przepraszam, ale się mylisz, jego metoda // $ this-> getRequest () jest przestarzała od 2.4, dlatego nie działa, więc tak naprawdę nie ma dostępu do obiektu żądania;)
AchrafSoltani

Chociaż nie mylisz się co do tego, pytający zastanawia się, która metoda pobiera zmienne z obiektu żądania. @Cerad poprawnie odpowiedział na to pytanie. Nie tylko podał prawidłowy sposób dostępu do obiektu żądania, ale także odpowiedział na pytanie.
Layton Everson,

0
public function indexAction(Request $request)
{
   $data = $request->get('corresponding_arg');
   // this also works
   $data1 = $request->query->get('corresponding_arg1');
}

1
Chociaż ten kod może odpowiedzieć na pytanie, lepiej byłoby dołączyć kontekst, wyjaśniając, jak to działa i kiedy go używać. Odpowiedzi zawierające tylko kod nie są przydatne na dłuższą metę.
Bono

0

Dla użytkowników Symfony 4:

$query = $request->query->get('query');

0

# www.example / register / admin

  /**
 * @Route("/register/{role}", name="app_register", methods={"GET"})
 */
public function register(Request $request, $role): Response
{
 echo $role ;
 }
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.