Как получить параметры запроса в symfony2


203

Я очень новичок в Symfony. В других языках, таких как Java и другие, я могу использовать, request.getParameter('parmeter name')чтобы получить значение.

Есть ли что-нибудь подобное, что мы можем сделать с Symfony2.
Я видел несколько примеров, но ни один не работает для меня. Предположим, у меня есть поле формы с именем пользователя . В форме действия я попытался использовать что-то вроде этого:

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

Я также пытался

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

и

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

Но ни один из вариантов не работает. Однако следующее работает нормально:

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

Где я делаю неправильно при использовании getParameter()метода. Любая помощь будет оценена.


У вас есть опечатка во второй строке: $request->request-get()должно быть $request->request->get(). Может ли это быть?
'11

написал то же самое в code.missed здесь. Извините за опечатку здесь. Пока это не работает.
Абдул Хамид

Вы (а) проверили руководство, чтобы убедиться, что get()это правильный метод, и (б) включили уведомления PHP, чтобы увидеть, есть ли проблемы? (c) Есть ли в Symfony 2 панель отладки, такая как symfony 1, так что вы можете увидеть, не допустили ли вы каких-либо ошибок?
halfer

Вы путаете имя и имя пользователя?
greg0ire

Более подробная информация здесь: roadtodev.com/recuperer-objet-request-de-symfony
Томас Бредиллет,

Ответы:


416

Именование не так уж и интуитивно понятно:

use Symfony\Component\HttpFoundation\Request;

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

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

46
Это отличается от того, что использует PHP, но на самом деле имеет больше смысла. $_GETданные - это данные из строки запроса ( GETзапрос вообще не требуется), а $_POSTданные - это данные из тела запроса (также не обязательно должен быть POSTзапрос PUT).
igorw

5
пробовал $ request-> query-> get ('name'); но это тоже не работает.
Абдул Хамид

7
Как получить параметры из запроса PUT?
Tjorriemorrie

10
Очень странное название здесь, конечно, $request->getи $request->postбыло бы проще.
crmpicco

3
комментарий от igorw вносит ясность в это причудливое соглашение об именах
Dheeraj

32

Я делаю это еще проще:

use Symfony\Component\HttpFoundation\Request;

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

Другой вариант - ввести ваши параметры в определение вашей функции действия:

use Symfony\Component\HttpFoundation\Request;

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

который затем предполагает, что вы определили {foo} и {bar} как часть вашего шаблона URL в файле routing.yml:

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

и в первом примере, если у меня есть fooпараметр как в строке запроса, так и в теле POST, какой из них будет возвращен $request->get('foo')?
Дмитрий К

1
Похоже, приоритет - это GET, PATH, POST api.symfony.com/master/Symfony/Component/HttpFoundation/…
Dimitry K

Это лучший ответ
steampowered

7
Нет, это не так. В документации самого метода говорится, что его не рекомендуется использовать, потому что он тяжелее, чем доступ к параметрам GET / POST через их конкретные коллекции.
Юрчикс

1
Ответ правильный $request->get('foo'); работает для ВСЕХ сумок (порядок: PATH, GET, POST). Тем не менее, $request->request->get('foo');работает только для POST Bag. Наконец, первый ( $request->get()) не рекомендуется, если мы знаем, где находятся данные (GET / POST).
F2000

18

Вы можете использовать следующий код, чтобы получить значения полей формы

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');
}

Или Вы также можете получить все значения формы в виде массива, используя

$request->request->all()

3
$ request-> request-> all () работает для меня, но что-то вроде $ request-> query-> get ('foo'); не работает.
Абдул Хамид

13

пытаться

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

проверить имя атрибута вашего поля формы


1
+1, так как я думаю, что из всех ответов только этот на самом деле утверждает неочевидную вещь - в тех случаях, когда вы создали свои формы автоматически с помощью конструктора форм symfony, symfony переименовывает поле формы в нечто большее, чем вы ожидать. Like name = "acme_demobundle_userform [field_name]"
userfuser

Синтаксис, который вы упомянули здесь, не работает с php 5.3.10. Какая минимальная версия поддерживает это?
Джастинас Лелис

2
@justinasLelys try $ userType = $ request-> request-> get ('acme_demobundle_usertype'); $ username = $ userType ['username'];
сон-

Синтаксис @JustinasLelys - PHP 5.4
COil

"имя пользователя" не может быть определено. Так что лучше сверьтесь с "??" первый.
Виктор Сидоренко

9

Внутри контроллера:

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

6
В более новых версиях Symfony $this->getRequest()устарела в пользу введения запроса в действие контроллера, например:public function showAction(Request $request, $id);
Адам Элсодани

9

Ваши варианты:

  1. Просто:
    • $request->request->get('param')( $_POST['param']) или
    • $request->query->get('param')( $_GET['param'])
  2. Хорошие формы Symfony со всей проверкой, преобразованием значений и отображением форм с ошибками и многими другими функциями:
  3. Что-то среднее (см. Пример ниже)
<?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,
    ]);
}

Подробнее о OptionsResolver- http://symfony.com/doc/current/components/options_resolver.html


8

Так как $this->getRequest()метод now устарел, вам нужно внедрить Requestобъект в действие вашего контроллера следующим образом:

public function someAction(Request $request)

после этого вы можете использовать один из следующих.

Если вы хотите получить данные POST из запроса, используйте следующее:

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

но если вы хотите получить данные GET из запроса, используйте это:

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

6

Вы можете сделать это так:

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

Иногда, когда атрибуты защищены, у вас не может быть доступа, чтобы получить значение для общего метода доступа:

(ПОЧТА)

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

(ПОЛУЧИТЬ)

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

(Generic)

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

1
Добро пожаловать в стек переполнения. Пожалуйста, отформатируйте свой ответ, чтобы сделать его более читабельным в следующий раз, а также проверьте эту страницу справки: Как ответить
Фабиан

Что делать, если есть 2 значение после получения? как это$clientName = $request->query->get('clientName','any');
Munkhdelger Tumenbayar

3

Большинство случаев, таких как получение строки запроса или параметров формы, описаны в ответах выше.

При работе с необработанными данными, например, необработанной строкой JSON в теле, которую вы хотели бы привести в качестве аргумента json_decode(), Request::getContent()можно использовать метод .

$content = $request->getContent();

Дополнительные полезные сведения о HTTP-запросах в Symfony можно найти в документации по пакету HttpFoundation .


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

Это все еще способ пойти для функций, которые не имеют Requestпараметра? (например, в частных функциях класса контроллера)
fritzmg

1
use Symfony\Component\HttpFoundation\Request;

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

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

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

}

Спасибо, вы также можете использовать приведенный выше код


0

Если вам нужно получить значение из выбора, вы можете использовать:

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

0

Попробуйте это, это работает

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

С уважением


Это не отвечает на вопрос вообще. Человек, задающий вопрос, уже имеет доступ к объекту запроса.
Лейтон Эверсон

1
@LaytonEverson извините, но вы ошибаетесь, его метод // $ this-> getRequest () устарел с 2.4, поэтому он не работает, поэтому у него нет доступа к объекту запроса;)
AchrafSoltani

Хотя вы не ошибаетесь в этом, asker задается вопросом, какой метод извлекает переменные из объекта запроса. @Cerad ответил на этот вопрос правильно. Он не только предоставил правильный способ доступа к объекту Request, но и ответил на вопрос.
Лейтон Эверсон

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

1
Хотя этот код может ответить на вопрос, было бы лучше включить некоторый контекст, объясняющий, как он работает и когда его использовать. Ответы только для кода бесполезны в долгосрочной перспективе.
Боно


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.