Як отримати параметри $ _POST та $ _GET


26

Я ajaxly викликаю маршрут і передаю йому дані. У своєму контролері я хочу отримати $_POST['var'], $_POST['var2']здається, через використання HttpFoundation в drupal 8, $_POSTа $_GETїх не існує в старому методі, як я можу отримати доступ до $_POSTпараметрів у користувальницькому контролері?


2
$ _POST все ще існує, ви просто не повинні використовувати його безпосередньо. Якщо $ _POST порожній, об'єкт запиту також буде порожнім, а помилка буде раніше. Часто це відбувається, наприклад, тому, що mod_rewrite не ввімкнено / налаштовано правильно, а сторінка перенаправляється через не знайдену директиву, яка видаляє дані про публікацію.
Бердір

Відповіді:


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

2
Дякую, це правдива відповідь на моє запитання, хоча я не отримав очікуваного результату (можливо, є проблема в іншому місці, я задаю це в іншому питанні.
Yusef

1
Я можу підтвердити, що ви можете використовувати \ Drupal :: request () -> query-> all () для отримання всіх змінних $ _GET.
окнат

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 реалізуйте гачку_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.