So erhalten Sie die Parameter $ _POST und $ _GET

21

Ich ajaxly eine Route aufrufen und übergeben Daten an sie, in meinem Controller, ich will bekommen $_POST['var'], $_POST['var2']scheint es wegen der Verwendung von HttpFoundation in Drupal 8, $_POSTund $_GETsind existiert nicht in die alte Methode, wie ich Zugriff auf $_POSTParameter in benutzerdefinierten - Controller?

Yusef
quelle
2
$ _POST ist noch vorhanden, Sie sollten es nur nicht direkt verwenden. Wenn $ _POST leer ist, ist auch das Anforderungsobjekt leer und Ihr Fehler tritt früher auf. Dies liegt zum Beispiel häufig daran, dass mod_rewrite nicht richtig aktiviert / konfiguriert ist und die Seite durch die Direktive not found umgeleitet wird, die die Post-Daten löscht.
Berdir

Antworten:

57

Aus dem Änderungssatz :

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

wird

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

Übrigens GETwürden Sie für vars Folgendes verwenden:

$query = \Drupal::request()->query->get('name');
Clive
quelle
1
Danke, und wissen Sie, wie ich alle Artikel bekommen kann? Ich meine $ _POST ganz und gar nicht einen Artikel.
Yusef
3
Ich habe nicht nachgesehen, aber wenn ich Symfony kenne, würde ich annehmen:\Drupal::request()->request->all()
Clive
2
Vielen Dank, dies ist die richtige Antwort auf meine Frage, obwohl ich das erwartete Ergebnis nicht erhalten habe (vielleicht gibt es ein Problem an einer anderen Stelle, ich stelle es in einer anderen Frage.
Yusef
1
Ich kann bestätigen, dass Sie \ Drupal :: request () -> query-> all () verwenden können, um alle $ _GET-Variablen abzurufen.
OKNATE
26

In einem Controller erhalten Sie die Anfrage mit einem typenbezogenen Argument 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];
  }

}

Weitere Informationen https://www.drupal.org/docs/8/api/routing-system/using-parameters-in-routes

4k4
quelle
11

Injizieren Sie die RequestStack in Ihren Controller.

Die aktuelle Anforderung enthält das queryAttribut, das wiederum die GET-Parameter enthält. requestenthält die POST-Parameter.

<?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
quelle
4

Sie können das Request-Objekt wie folgt überprüfen

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

es wird GET oder POST oder was auch immer zurückgeben. Wenn Sie in einem Objekt arbeiten, denken Sie daran, DI den Anforderungsdienst.

Regelweb
quelle
3

Wenn Sie verwenden Content-Type: application/json, verwenden Sie bitte:

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

Keine der anderen Antworten funktionierte für mich, aber ich fand das, das tat:

$request->getContent();
joekers
quelle
0

Im folgenden Beispiel wird auf URL-Parameter zugegriffen und diese an eine TWIG-Vorlage übergeben. Ich gehe davon aus, dass Sie Ihr Modul und die erforderlichen Dateien bereits erstellt haben und dass "/ test? Fn = admin" Ihre URL ist

  1. Implementieren Sie in Ihrer .module-Datei hook_theme und definieren Sie Variablen und Vorlagennamen (Stellen Sie sicher, dass Sie "_" durch "-" ersetzen, wenn Sie die Vorlagendatei erstellen)
function my_module_theme () {   
     return [
      'your_template_name' => [               
         'variables' => [
             'first_name'    => NULL,
          ],   
     ]; 
   }

Erstellen Sie nun Ihren Controller und geben Sie den folgenden Code ein.

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

 }

Jetzt können Sie in Ihrer TWIG-Datei, die "my-template.html.twig" sein sollte, auf diesen Parameter zugreifen als:

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

Und es ist geschafft. Hoffe das hilft.

Umesh Patil
quelle