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


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

 34
8
Author: Yuseferi, 2016-07-14

7 answers

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

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

Становится

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

Кстати, для GET vars вы бы использовали:

$query = \Drupal::request()->query->get('name');
 76
Author: Clive, 2016-07-14 09:58:32

В контроллере получите запрос с аргументом с намеком на тип 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');

    // POST requests are not cached, but for GET you need a cache context
    return [
      '#markup' => $foo,
      '#cache' => ['contexts' => ['url.query_args:foo']],
    ];
  }

}

Дополнительная информация https://www.drupal.org/docs/8/api/routing-system/using-parameters-in-routes

 34
Author: 4k4, 2020-08-31 12:38:55

Введите RequestStack в свой контроллер.

Текущий запрос содержит атрибут query, который, в свою очередь, содержит параметры GET. request содержит параметры ЗАПИСИ.

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

}
 15
Author: Tim, 2017-06-14 08:17:33

Вы можете проверить объект запроса, например

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

Он вернет GET или POST или что-то еще. Если вы работаете внутри объекта, не забудьте позвонить в службу запросов.

 4
Author: ruloweb, 2017-06-19 14:34:58

Если вы используете Content-Type: application/json, пожалуйста, используйте:

$post_data = json_decode( $this->request->getContent(),TRUE);
 4
Author: Denis Viunyk, 2019-10-20 18:35:41

Ни один из других ответов не сработал для меня, но я нашел вот что:

$request->getContent();
 2
Author: joekers, 2019-06-07 11:10:15

Вот пример доступа к параметрам URL-адреса и передачи их в шаблон ветки, Я полагаю, что вы уже создали свой модуль и необходимые файлы и предположим, что "/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"
     ];
   }

 }

Теперь в вашем Файл ВЕТКИ, который должен быть "my-template.html.twig", вы можете получить доступ к этому параметру как,

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

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

 0
Author: Umesh Patil, 2019-11-27 12:15:27