Як отримати параметри запиту у symfony2


203

Я дуже новачок у сімфоні. В інших мовах, таких як 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(). Чи може це бути?
половина

написали те саме в code.missed out here.sorry для друку тут. доки це не працює.
Абдул Хамід

Ви (а) перевірили посібник, щоб переконатися, що get()це правильний метод, і (b) увімкнули повідомлення PHP, щоб ви могли побачити, чи є проблеми? (c) Чи є у Symfony 2 панель інструментів для налагодження на зразок symfony 1, тож ви можете побачити, чи допустили ви помилки?
півзахисник

Ви плутаєте ім’я та ім’я користувача?
greg0ire

Більше інформації тут: roadtodev.com/recuperer-objet-request-de-symfony
Thomas Bredillet

Відповіді:


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 ('ім'я'); але це також не працює.
Абдул Хамід

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

Це найкраща відповідь
пару

7
Ні це не так. Документація самого методу говорить про те, що використовувати його не рекомендується, оскільки це важче, ніж отримати доступ до параметрів GET / POST через їх конкретні колекції.
jurchiks

1
Відповідь - правильні $request->get('foo'); роботи для ВСІХ мішків (замовлення: PATH, GET, POST). Тим не менш, $request->request->get('foo');працює тільки для POST сумки. Нарешті, перший ( $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 спробуйте $ userType = $ request-> request-> get ('acme_demobundle_usertype'); $ username = $ userType ['ім'я користувача'];
сон-ер

Синтаксисом @JustinasLelys є PHP 5.4
COil

"ім'я користувача" не можна визначити. Тож краще перевірити "??" перший.
Віктор Сидоренко

9

Всередині контролера:

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

6
У новіших версіях Symfony $this->getRequest()є застарілим, на користь введення Запити в дію контролера, наприклад:public function showAction(Request $request, $id);
Adam Elsodaney

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()метод застарілий, вам потрібно ввести Requestоб'єкт у дію контролера так:

public function someAction(Request $request)

після цього ви можете скористатися одним із наступних.

Якщо ви хочете отримати дані POST з запиту, використовуйте наступне:

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

але якщо ви хочете отримати дані з запиту, використовуйте це:

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

6

Ви можете це зробити:

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

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

(POST)

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

(Отримати)

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

(GENERIC)

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

1
Ласкаво просимо до переповнення стека. Будь ласка, відформатуйте свою відповідь, щоб наступного разу зробити її легше читати, а також ознайомтесь із цією сторінкою довідки: Як відповісти
Fabian Horlacher

що робити, якщо після отримання є 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

Хоча ви не помиляєтесь з цим, Аскер цікавить, який метод витягує змінні з об’єкта запиту. @Cerad відповів правильно на це питання. Він не тільки запропонував правильний доступ до об’єкта Запити, але й відповів на запитання.
Лейтон Еверсон

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.