【问题标题】:How to get the request parameters in Symfony 2?如何在 Symfony 2 中获取请求参数?
【发布时间】:2012-04-04 19:25:51
【问题描述】:

我对 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()。会这样吗?
  • 在代码中写了相同的内容。在这里错过了。抱歉这里的错字。仍然无法正常工作。
  • 您是否 (a) 检查了手册以确保 get() 是正确的方法并 (b) 打开 PHP 通知以便查看是否有任何问题? (c) Symfony 2 是否有像 symfony 1 一样的调试工具栏,所以你可以查看是否有任何错误?
  • 您是否混淆了名字和用户名?

标签: php symfony


【解决方案1】:

命名并不是那么直观:

use Symfony\Component\HttpFoundation\Request;

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

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

2021 年 11 月更新:$request->get('name') has been deprecated in 5.4,自 6.0 起将是私有的。很长一段时间以来,人们一直不鼓励使用它。

【讨论】:

  • 它与PHP使用的不同,但实际上更有意义。 $_GET 数据是来自查询字符串的数据(根本不需要 GET 请求),$_POST 数据是来自请求正文的数据(也不必是 POST 请求,可以是 PUT) .
  • 试过 $request->query->get('name');但它也不起作用。
  • 如何从 PUT 请求中获取参数?
  • 这里的命名很奇怪,肯定$request->get$request->post会更简单。
  • igorw 的评论让这个怪异的命名约定变得清晰
【解决方案2】:

我做的更简单:

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 }

【讨论】:

  • 在第一个示例中,如果我在查询字符串和 POST 正文中都有 foo 参数,$request->get('foo') 将返回哪个参数?
  • 看起来优先级是 GET、PATH、POST api.symfony.com/master/Symfony/Component/HttpFoundation/…
  • 这是最好的答案
  • 不,不是。该方法本身的文档说不鼓励使用它,因为它比通过特定集合访问 GET/POST 参数更重。
  • 答案是正确的 $request->get('foo'); 适用于所有包(顺序为:PATH、GET、POST)。尽管如此,$request->request->get('foo'); 仅适用于 POST 包。最后,如果我们知道数据在哪里(GET/POST),不建议使用第一个($request->get())。
【解决方案3】:

您可以使用以下代码获取表单字段值

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()

【讨论】:

  • $request->request->all() 对我有用,但类似于 $request->query->get('foo');不工作。
【解决方案4】:

试试

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

检查公式字段的属性名称

【讨论】:

  • +1,因为我认为在所有回复中,只有这一个实际上说明了不明显的事情 - 如果您在 symfony 的表单构建器的帮助下自动创建了表单,symfony 会重命名表单领域超出您的预期。喜欢 name="acme_demobundle_userform[field_name]"
  • 您在此处提到的语法不适用于 php 5.3.10。支持它的最低版本是多少?
  • @justinasLelys 尝试 $userType = $request->request->get('acme_demobundle_usertype'); $username = $userType['username'];
  • @JustinasLelys 语法为 PHP 5.4
  • “用户名”无法定义。所以最好用“??”检查首先。
【解决方案5】:

在控制器内部:

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

【讨论】:

  • 在较新版本的 Symfony 中,$this->getRequest() 已被弃用,有利于将请求注入控制器操作,例如:public function showAction(Request $request, $id);
【解决方案6】:

由于现在 $this->getRequest() 方法已被弃用,您需要将 Request 对象注入到您的控制器操作中,如下所示:

public function someAction(Request $request)

之后,您可以使用以下方法之一。

如果您想从请求中获取 POST 数据,请使用以下内容:

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

但如果你想从请求中获取 GET 数据,请使用:

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

【讨论】:

    【解决方案7】:

    您的选择:

    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】:

      你可以这样做:

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

      有时,当属性受到保护时,你无法通过常用的访问方法获取值:

      (发布)

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

      (获取)

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

      (通用)

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

      【讨论】:

      • 欢迎来到 Stack Overflow。请格式化您的答案以使其下次更具可读性,并查看此帮助页面:How to Answer
      • 如果 get 后有 2 个值怎么办?像这样$clientName = $request-&gt;query-&gt;get('clientName','any');
      【解决方案9】:

      上面的答案涵盖了大多数情况,例如获取查询字符串或表单参数。

      在处理原始数据时,例如您希望作为参数提供给 json_decode() 的正文中的原始 JSON 字符串,可以使用方法 Request::getContent()

      $content = $request->getContent();
      

      关于 Symfony 中 HTTP 请求的其他有用信息可以在 HttpFoundation 包的文档中找到。

      【讨论】:

        【解决方案10】:

        对于 symfony 4 用户:

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

        【讨论】:

          【解决方案11】:
          $request = Request::createFromGlobals();
          $getParameter = $request->get('getParameter');
          

          【讨论】:

          • 对于没有Request 参数的函数,这仍然是可行的方法吗? (例如在控制器类的私有函数中)
          【解决方案12】:
          use Symfony\Component\HttpFoundation\Request;
          
          public function indexAction(Request $request, $id) {
          
              $post = $request->request->all();
          
              $request->request->get('username');
          
          }
          

          谢谢,你也可以使用上面的代码

          【讨论】:

            【解决方案13】:

            #www.example/register/admin

              /**
             * @Route("/register/{role}", name="app_register", methods={"GET"})
             */
            public function register(Request $request, $role): Response
            {
             echo $role ;
             }
            

            【讨论】:

              【解决方案14】:

              如果您需要从选择中获取值,您可以使用:

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

              【讨论】:

                【解决方案15】:

                试试这个,效果很好

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

                问候

                【讨论】:

                • 这根本没有回答问题。提出问题的人已经有权访问请求对象。
                • @LaytonEverson 抱歉,但你错了,他的方法 // $this->getRequest() 自 2.4 起已弃用,这就是它不起作用的原因,所以他实际上无法访问请求对象;)
                • 虽然你没有错,但询问者想知道什么方法从请求对象中检索变量。 @Cerad 正确回答了这个问题。他不仅提供了访问 Request 对象的正确方法,还回答了问题。
                【解决方案16】:
                public function indexAction(Request $request)
                {
                   $data = $request->get('corresponding_arg');
                   // this also works
                   $data1 = $request->query->get('corresponding_arg1');
                }
                

                【讨论】:

                • 虽然这段代码可以回答这个问题,但最好包含一些上下文,解释它是如何工作的以及何时使用它。从长远来看,纯代码的答案没有用处。
                猜你喜欢
                • 1970-01-01
                • 2012-01-17
                • 1970-01-01
                • 2016-12-20
                • 2017-10-21
                • 2021-01-12
                • 2020-06-12
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多