Jak uzyskać parametry $ _POST i $ _GET

26

Wzywam trasę i przekazuję do niej dane, w moim kontrolerze chcę uzyskać $_POST['var'], $_POST['var2']wygląda na to, że korzystam z HttpFoundation w drupal 8 $_POSTi $_GETnie ma ich w starej metodzie. Jak mogę uzyskać dostęp do $_POSTparametrów w niestandardowym kontrolerze?

Yusef
źródło
2
$ _POST nadal istnieje, po prostu nie powinieneś go używać bezpośrednio. Jeśli $ _POST jest pusty, wówczas obiekt żądania również będzie pusty, a błąd wystąpi wcześniej. Często dzieje się tak na przykład dlatego, że mod_rewrite nie jest włączony / skonfigurowany poprawnie, a strona jest przekierowywana przez nie znalezioną dyrektywę, która usuwa dane postu.
Berdir

Odpowiedzi:

62

Z zapisu zmian :

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

staje się

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

Nawiasem mówiąc, dla GETvars użyłbyś:

$query = \Drupal::request()->query->get('name');
Clive
źródło
1
dzięki i czy wiesz jak mogę zdobyć wszystkie przedmioty? Mam na myśli, że $ _POST całkowicie nie jest jednym przedmiotem.
Yusef
3
Nie sprawdziłem, ale znając Symfony, zakładam:\Drupal::request()->request->all()
Clive
2
Dzięki, to jest prawdziwa odpowiedź na moje pytanie, chociaż nie otrzymałem oczekiwanego rezultatu (może jest problem w innym miejscu, zadaję to w innym pytaniu.
Yusef
1
Mogę potwierdzić, że możesz użyć \ Drupal :: request () -> query-> all (), aby uzyskać wszystkie zmienne $ _GET.
oknate
29

W kontrolerze pobierz żądanie z argumentem podanym w typie 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];
  }

}

Więcej informacji https://www.drupal.org/docs/8/api/routing-system/using-parameters-in-routes

4k4
źródło
11

Wstrzyknąć RequestStackdo kontrolera.

Bieżące żądanie zawiera queryatrybut, który z kolei zawiera parametry GET. requestzawiera parametry 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');
  }

}
Tim
źródło
4

Możesz sprawdzić obiekt żądania jak

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

zwróci GET lub POST lub cokolwiek innego. Jeśli pracujesz w obiekcie, pamiętaj, aby DI zamówić usługę.

ruloweb
źródło
3

Jeśli używasz, Content-Type: application/jsonużyj:

$post_data = json_decode( $this->request->getContent(),TRUE);
Denis Viunyk
źródło
2

Żadna z pozostałych odpowiedzi nie działała dla mnie, ale znalazłem to, co:

$request->getContent();
joekers
źródło
0

Oto przykład uzyskiwania dostępu do parametrów adresu URL i przekazywania ich do szablonu TWIG. Rozważam, że masz już utworzony moduł i wymagane pliki, i przypuszczam, że „/ test? Fn = admin” to adres URL

  1. W swoim pliku .module zaimplementuj hook_theme i zdefiniuj zmienne oraz nazwę szablonu (podczas tworzenia pliku szablonu zamień „_” na „-”)
function my_module_theme () {   
     return [
      'your_template_name' => [               
         'variables' => [
             'first_name'    => NULL,
          ],   
     ]; 
   }

Teraz utwórz kontroler i umieść w nim poniższy kod.

 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"
     ];
   }

 }

Teraz w pliku TWIG, który powinien mieć postać „my-template.html.twig”, możesz uzyskać dostęp do tego parametru jako:

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

I gotowe. Mam nadzieję że to pomoże.

Umesh Patil
źródło