Cómo obtener los parámetros $ _POST y $ _GET

24

Ajaxly llamo una ruta y le paso datos, en mi controlador, quiero obtener $_POST['var'], $_POST['var2']parece debido al uso de HttpFoundation en drupal 8, $_POSTy $_GETno existen en el método anterior, ¿cómo puedo acceder a los $_POSTparámetros en el controlador personalizado?

Yusef
fuente
2
$ _POST todavía existe, simplemente no deberías usarlo directamente. Si $ _POST está vacío, el objeto de solicitud también estará vacío y su error ocurrirá antes. A menudo, esto se debe, por ejemplo, a que mod_rewrite no está habilitado / configurado correctamente y la página se redirige a través de la directiva no encontrada, que elimina los datos de publicación.
Berdir

Respuestas:

60

Del registro de cambios :

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

se convierte

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

Por cierto, para GETvars, usarías:

$query = \Drupal::request()->query->get('name');
Clive
fuente
1
gracias, y sabes cómo puedo obtener todos los artículos? Me refiero a $ _POST por completo, no un artículo.
Yusef
3
No lo he comprobado, pero conozco a Symfony suponiendo:\Drupal::request()->request->all()
Clive
2
Gracias, esta es la verdadera respuesta a mi pregunta, aunque no obtuve el resultado esperado (tal vez hay un problema en otro lugar, lo pregunto en otra pregunta.
Yusef
1
Puedo confirmar que puede usar \ Drupal :: request () -> query-> all () para obtener todas las variables $ _GET.
oknate
29

En un controlador, obtenga la solicitud con un argumento de tipo insinuado 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];
  }

}

Más información https://www.drupal.org/docs/8/api/routing-system/using-parameters-in-routes

4k4
fuente
11

Inyecte el RequestStacken su controlador.

La solicitud actual contiene el queryatributo que a su vez contiene los parámetros GET. requestcontiene los parámetros 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
fuente
4

Puede verificar el objeto Solicitar como

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

devolverá GET o POST o lo que sea. Si está trabajando dentro de un objeto, recuerde DI el servicio de solicitud.

ruloweb
fuente
3

Si está utilizando Content-Type: application/json, utilice:

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

Ninguna de las otras respuestas funcionó para mí, pero encontré esto que sí:

$request->getContent();
joekers
fuente
0

Este es el ejemplo de acceder a los parámetros de URL y pasarlos a una plantilla TWIG. Estoy considerando que ya ha creado su módulo y los archivos necesarios y supongo que "/ test? Fn = admin" es su URL.

  1. En su archivo .module implemente hook_theme y defina las variables y el nombre de la plantilla (Asegúrese de reemplazar "_" con "-" al crear el archivo de plantilla)
function my_module_theme () {   
     return [
      'your_template_name' => [               
         'variables' => [
             'first_name'    => NULL,
          ],   
     ]; 
   }

Ahora cree su controlador y ponga el siguiente código en él.

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

 }

Ahora en su archivo TWIG que debe ser "my-template.html.twig" puede acceder a este parámetro como,

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

Y ya está hecho. Espero que esto ayude.

Umesh Patil
fuente