Как получить параметры $ _POST и $ _GET


24

Я ajaxly вызываю маршрут и передаю данные на него. В моем контроллере я хочу получить $_POST['var'], $_POST['var2']кажется, из-за использования HttpFoundation в drupal 8, $_POSTи $_GETне существует в старом методе. Как я могу получить доступ к $_POSTпараметрам в пользовательском контроллере?


2
$ _POST все еще существует, вы просто не должны использовать его напрямую. Если $ _POST пусто, то объект запроса также будет пустым, и ваша ошибка произойдет раньше. Часто это происходит, например, потому что mod_rewrite не включен / не настроен правильно, и страница перенаправляется через директиву not found, которая отбрасывает данные постов.
Бердир

Ответы:


60

Из записи изменений :

$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()
Клайв

2
Спасибо, это верный ответ на мой вопрос, хотя я не получил ожидаемого результата (возможно, есть проблема в другом месте, я задаю ее в другом вопросе.
Юсеф

1
Я могу подтвердить, что вы можете использовать \ Drupal :: request () -> query-> all (), чтобы получить все переменные $ _GET.
17

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>

И это сделано. Надеюсь это поможет.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.