Como obter os parâmetros $ _POST e $ _GET

22

Eu chamo ajaxly de uma rota e passo os dados para ela. No meu controlador, quero obter $_POST['var'], $_POST['var2']parece que, devido ao uso de HttpFoundation no drupal 8, $_POSTe $_GETnão existe no método antigo, como posso acessar $_POSTparâmetros no Controller personalizado?

Yusef
fonte
2
$ _POST ainda existe, você simplesmente não deve usá-lo diretamente. Se $ _POST estiver vazio, o objeto de solicitação também estará vazio e seu erro ocorrerá mais cedo. Freqüentemente, isso ocorre, por exemplo, porque mod_rewrite não está ativado / configurado corretamente e a página é redirecionada através da diretiva não encontrada, que descarta os dados de postagem.
Berdir 14/07/2016

Respostas:

58

No registro de alterações :

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

torna-se

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

Aliás, para GETvars, você usaria:

$query = \Drupal::request()->query->get('name');
Clive
fonte
1
obrigado e você sabe como posso obter todos os itens? Quero dizer $ _POST completamente, não um item.
Yusef 14/07
3
Eu não verifiquei, mas conhecendo o Symfony, eu diria:\Drupal::request()->request->all()
Clive
2
Obrigado, isso é verdade resposta à minha pergunta, embora eu não obter resultado esperado (talvez haja um problema em outro lugar, eu pedi-lo em outra pergunta.
Yusef
1
Posso confirmar que você pode usar \ Drupal :: request () -> query-> all () para obter todas as variáveis ​​$ _GET.
oknate
27

Em um controlador, obtenha a solicitação com um argumento com dicas de tipo 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];
  }

}

Mais informações https://www.drupal.org/docs/8/api/routing-system/using-parameters-in-routes

4k4
fonte
11

Injete RequestStackno seu controlador.

A solicitação atual contém o queryatributo que, por sua vez, contém os parâmetros GET. requestcontém os 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
fonte
4

Você pode verificar o objeto Request como

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

ele retornará GET ou POST ou o que for. Se você estiver trabalhando dentro de um objeto, lembre-se de registrar o serviço de solicitação.

ruloweb
fonte
3

Se você estiver usando Content-Type: application/json, use:

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

Nenhuma das outras respostas funcionou para mim, mas achei o seguinte:

$request->getContent();
joekers
fonte
0

Aqui está o exemplo de como acessar parâmetros de URL e passá-los para um modelo TWIG. Estou considerando que você já criou seu módulo e os arquivos necessários e suponha que "/ test? Fn = admin" seja sua URL

  1. No arquivo .module, implemente hook_theme e defina variáveis ​​e nome do modelo (substitua "_" por "-" ao criar o arquivo de modelo)
function my_module_theme () {   
     return [
      'your_template_name' => [               
         'variables' => [
             'first_name'    => NULL,
          ],   
     ]; 
   }

Agora crie seu controlador e insira o código abaixo.

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

 }

Agora, no seu arquivo TWIG, que deve ser "my-template.html.twig", você pode acessar este parâmetro como,

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

E está feito. Espero que isto ajude.

Umesh Patil
fonte