如何获取$ _POST和$ _GET参数


26

我断断续续地调用路由并将数据传递给它,在我的控制器中,我想获取$_POST['var']$_POST['var2']这似乎是因为在drupal 8中使用了HttpFoundation,$_POST$_GET在旧方法中不存在,如何访问$_POST自定义控制器中的参数?


2
$ _POST仍然存在,您只应直接使用它。如果$ _POST为空,则请求对象也将为空,并且您的错误会更早发生。通常,这是因为(例如)未正确启用/配置mod_rewrite并通过未找到的指令重定向页面,从而删除了发布数据。
贝尔迪尔

Answers:


62

更改记录

$name = $_POST['name']; // form param

变成

$name = \Drupal::request()->request->get('name'); // form param

顺带提及,对于GETvars,您可以使用:

$query = \Drupal::request()->query->get('name');

1
谢谢,您知道我如何获得所有物品吗?我的意思是$ _POST完全不是一项。
优素福

3
我没有检查,但是知道Symfony时我会假设:\Drupal::request()->request->all()
Clive

2
谢谢,这是对我的问题的真实答案,尽管我没有得到预期的结果(也许在另一个地方有问题,我在另一个问题中提出。)
Yusef

1
我可以确认您可以使用\ Drupal :: request()-> query-> all()来获取所有$ _GET变量。
oknate

29

在控制器中,获取带有类型提示参数的请求Request $request

<?php

namespace Drupal\mymodule\Controller;

use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\HttpFoundation\Request;

class ExampleController extends ControllerBase {

  /**
   * Controller to return a POST or a GET parameter.
   */
  public function action(Request $request) {

    // get your POST parameter
    $foo = $request->request->get('foo');

    // or get your GET parameter
    $foo = $request->query->get('foo');

    return ['#markup' => $foo];
  }

}

更多信息https://www.drupal.org/docs/8/api/routing-system/using-parameters-in-routes


11

RequestStack注入您的控制器。

当前请求包含query属性,该属性又包含GET参数。request包含POST参数。

<?php

namespace Drupal\example_module\Controller;

use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * An example controller.
 */
class ExampleController extends ControllerBase {

  /**
   * @var Symfony\Component\HttpFoundation\RequestStack
   */
  private $requestStack;

  /**
   * Constructor.
   *
   * @param Symfony\Component\HttpFoundation\RequestStack $request_stack
   */
  public function __construct(RequestStack $request_stack) {
    $this->requestStack = $request_stack;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('request_stack')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function action() {
    // Get your GET parameter here.
    $this->requestStack->getCurrentRequest()->query->get('foo');
  }

}

4

您可以像检查对象

\Drupal::request()->getMethod();

它将返回GET或POST或其他内容。如果您正在处理对象,请记住对请求服务进行DI。


3

如果您正在使用,Content-Type: application/json请使用:

$post_data = json_decode( $this->request->getContent(),TRUE);

2

没有其他答案对我有用,但是我发现这样做:

$request->getContent();

0

这是访问URL参数并将其传递给TWIG模板的示例,我考虑到您已经创建了模块和必需的文件,并假设“ / test?fn = admin”是您的URL

  1. 在您的.module文件中,实现hook_theme并定义变量和模板名称(确保在创建模板文件时将“ _”替换为“-”)
function my_module_theme () {   
     return [
      'your_template_name' => [               
         'variables' => [
             'first_name'    => NULL,
          ],   
     ]; 
   }

现在创建您的控制器,并将下面的代码放入其中。

 namespace Drupal\my_module\Controller;

 use Drupal\Core\Controller\ControllerBase;
 use Symfony\Component\HttpFoundation\Request;


 class MyModule extends ControllerBase {

   public function content(Request $request) {

     return [
       '#theme' => 'my_template',
       '#first_name' => $request->query->get('fn'), //This is because the parameters are in $_GET, if you are accessing from $_POST then use "request" instead "query"
     ];
   }

 }

现在,在您的TWIG文件(应为“ my-template.html.twig”)中,您可以通过以下方式访问此参数:

 <h3>First Name: {{ first_name }}</h3>

它完成了。希望这可以帮助。

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.