Comment obtenir les paramètres $ _POST et $ _GET

25

J'appelle un itinéraire et lui transmets des données, Dans mon contrôleur, je veux obtenir $_POST['var'], $_POST['var2']semble-t-il à cause de l'utilisation de HttpFoundation dans Drupal 8, $_POSTet $_GETn'existe pas dans l'ancienne méthode, Comment puis-je accéder aux $_POSTparamètres dans le contrôleur personnalisé?

Yusef
la source
2
$ _POST existe toujours, vous ne devriez pas l'utiliser directement. Si $ _POST est vide, l'objet de demande sera également vide et votre erreur se produit plus tôt. Souvent, c'est par exemple parce que mod_rewrite n'est pas activé / configuré correctement et la page est redirigée via la directive not found, qui supprime les données de publication.
Berdir

Réponses:

61

À partir de l' enregistrement des modifications :

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

devient

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

Par ailleurs, pour GETvars, vous utiliseriez:

$query = \Drupal::request()->query->get('name');
Clive
la source
1
merci, et savez-vous comment puis-je obtenir tous les articles? Je veux dire $ _POST complètement pas un élément.
Yusef
3
Je n'ai pas vérifié, mais connaissant Symfony, je suppose que:\Drupal::request()->request->all()
Clive
2
Merci, c'est la vraie réponse à ma question même si je n'ai pas obtenu le résultat attendu (peut-être qu'il y a un problème dans un autre endroit, je le pose dans une autre question.
Yusef
1
Je peux confirmer que vous pouvez utiliser \ Drupal :: request () -> query-> all () pour obtenir toutes les variables $ _GET.
Oknate
29

Dans un contrôleur, obtenez la demande avec un argument de type 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];
  }

}

Plus d'infos https://www.drupal.org/docs/8/api/routing-system/using-parameters-in-routes

4k4
la source
11

Injectez le RequestStackdans votre manette.

La demande actuelle contient l' queryattribut qui à son tour contient les paramètres GET. requestcontient les paramètres 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
la source
4

Vous pouvez vérifier l'objet Request comme

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

il retournera GET ou POST ou autre chose. Si vous travaillez à l'intérieur d'un objet, pensez à DI le service Request.

ruloweb
la source
3

Si vous utilisez, Content-Type: application/jsonveuillez utiliser:

$post_data = json_decode( $this->request->getContent(),TRUE);
Denis Viunyk
la source
2

Aucune des autres réponses n'a fonctionné pour moi, mais j'ai trouvé que cela fonctionnait:

$request->getContent();
joekers
la source
0

Voici l'exemple d'accès aux paramètres d'URL et de les transmettre à un modèle TWIG, je considère que vous avez déjà créé votre module et les fichiers requis et supposez que "/ test? Fn = admin" est votre URL

  1. Dans votre fichier .module implémentez hook_theme et définissez les variables et le nom du modèle (assurez-vous de remplacer "_" par "-" lors de la création du fichier modèle)
function my_module_theme () {   
     return [
      'your_template_name' => [               
         'variables' => [
             'first_name'    => NULL,
          ],   
     ]; 
   }

Créez maintenant votre contrôleur et insérez-y le code ci-dessous.

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

 }

Maintenant, dans votre fichier TWIG qui devrait être "my-template.html.twig", vous pouvez accéder à ce paramètre en tant que,

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

Et c'est fait. J'espère que cela t'aides.

Umesh Patil
la source