Как получить параметры запроса в 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');
Cerad
источник
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 }
pkout
источник
и в первом примере, если у меня есть 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']

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

MartinW.
источник
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');
Reinherd
источник
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');
Yoander
источник
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();
sncardonam
источник
0

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

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

С уважением

AchrafSoltani
источник
Это не отвечает на вопрос вообще. Человек, задающий вопрос, уже имеет доступ к объекту запроса.
Лейтон Эверсон
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');
}
abhinand
источник
1
Хотя этот код может ответить на вопрос, было бы лучше включить некоторый контекст, объясняющий, как он работает и когда его использовать. Ответы только для кода бесполезны в долгосрочной перспективе.
Боно
0

Для пользователей Symfony 4:

$query = $request->query->get('query');
кузнец
источник
0

# Www.example / регистрация / админ

  /**
 * @Route("/register/{role}", name="app_register", methods={"GET"})
 */
public function register(Request $request, $role): Response
{
 echo $role ;
 }
Хандакер Тоихидул Ислам
источник