如何在symfony2中获取请求参数


203

我对symfony非常陌生。在其他语言(如java和其他语言)中,我可以request.getParameter('parmeter name')用来获取值。

我们可以使用symfony2做类似的事情吗?
我看到了一些示例,但没有一个对我有用。假设我有一个名为username的表单字段。在表单操作中,我尝试使用如下形式:

$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()。可以吗?
2012年

已经在代码中写了相同的代码。在这里错过了。对不起这里的错字。仍然无法正常工作。
阿卜杜勒·哈米德

您(a)已检查手册以确保get()方法正确,并且(b)是否打开了PHP通知,以便可以查看是否有问题?(c)Symfony 2是否具有像symfony 1一样的调试工具栏,因此您可以查看是否犯了任何错误?
halfer

您是否混淆名字和用户名?
greg0ire 2012年

Answers:


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的用法不同,但实际上更有意义。$_GETdata是来自查询字符串的数据(根本GET不需要任何请求),而$_POSTdata是来自请求正文的数据(也不必是POST请求,可以是PUT)。
igorw

5
尝试$ request-> query-> get('name'); 但它也不起作用。
阿卜杜勒·哈米德

7
如何从PUT请求中获取参数?
Tjorriemorrie 2013年

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

然后,假设您在routing.yml文件中将{foo}和{bar}定义为URL模式的一部分:

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

在第一个示例中,如果我foo在查询字符串和POST正文中都具有参数,那么将返回哪个参数$request->get('foo')
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'); 不管用。
Abdul Hamid 2012年

13

尝试

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

检查您的公式字段的属性名称


1
+1,因为我认为在所有响应中,只有一个实际上表明了非显而易见的内容-如果您是在symfony的表单生成器的帮助下自动创建表单的,则symfony将form字段重命名为比您想要的更多的字段期望。就像name =“ acme_demobundle_userform [field_name]”
userfuser 2014年

您在此处提到的语法不适用于php 5.3.10。支持该功能的最低版本是多少?
Justinas Lelys 2014年

2
@justinasLelys尝试$ userType = $ request-> request-> get('acme_demobundle_usertype'); $ username = $ userType ['username'];
sleep-er 2014年

@JustinasLelys语法是PHP 5.4
线圈

无法定义“用户名”。所以最好用“ ??”检查 第一。
Viktor Sydorenko '17

9

在控制器内部:

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

6
在较新版本的Symfony中,$this->getRequest()已弃用,赞成将Request注入控制器操作,例如:public function showAction(Request $request, $id);
Adam Elsodaney 2014年

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

但是,如果您想从请求中获取GET数据,请使用以下命令:

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

6

您可以这样做:

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

有时,当属性受到保护时,您将无权获取通用访问方法的值:

(开机自检)

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

(得到)

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

(一般)

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

1
欢迎使用堆栈溢出。请格式化您的答案以使其下一次更易读,也请查看此帮助页面:How to Answer
Fabian Horlacher

得到后如果有2个值怎么办?像这样$clientName = $request->query->get('clientName','any');
Munkhdelger Tumenbayar


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

对于没有Request参数的函数,这仍然是一种方法吗?(例如,在控制器类的私有函数中)
2016年

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正确回答了这个问题。他不仅提供了访问Request对象的正确方法,而且还回答了问题。
雷顿·埃弗森

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

1
尽管此代码可以回答问题,但最好包含一些上下文,说明其工作方式和使用时间。从长远来看,纯代码答案没有用。
博诺

0

对于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 ;
 }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.