Cara mendapatkan parameter $ _POST dan $ _GET

24

Saya ajaxly memanggil rute dan meneruskan data ke sana, Di controller saya, saya ingin mendapatkan $_POST['var'],, $_POST['var2']sepertinya karena menggunakan HttpFoundation di drupal 8, $_POSTdan $_GETtidak ada dalam metode lama, Bagaimana saya bisa mengakses $_POSTparameter di Custom Controller?

Yusef
sumber
2
$ _POST masih ada, Anda tidak perlu menggunakannya secara langsung. Jika $ _POST kosong, maka objek permintaan juga akan kosong dan kesalahan Anda terjadi lebih awal. Seringkali, ini misalnya karena mod_rewrite tidak diaktifkan / dikonfigurasi dengan benar dan halaman dialihkan melalui arahan tidak ditemukan, yang menjatuhkan data posting.
Berdir

Jawaban:

60

Dari catatan perubahan :

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

menjadi

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

Secara kebetulan, untuk GETvars, Anda akan menggunakan:

$query = \Drupal::request()->query->get('name');
Clive
sumber
1
terima kasih, dan tahukah Anda bagaimana saya bisa mendapatkan semua barang? Maksud saya $ _POST sama sekali bukan satu item.
Yusef
3
Saya belum memeriksa, tetapi mengetahui Symfony saya akan berasumsi:\Drupal::request()->request->all()
Clive
2
Terima kasih, ini adalah jawaban yang benar untuk pertanyaan saya walaupun saya tidak mendapatkan hasil yang diharapkan (mungkin ada masalah di tempat lain, saya menanyakannya di pertanyaan lain.
Yusef
1
Saya dapat mengonfirmasi bahwa Anda dapat menggunakan \ Drupal :: request () -> query-> all () untuk mendapatkan semua variabel $ _GET.
oknate
29

Dalam controller, dapatkan permintaan dengan argumen type-hinted 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];
  }

}

Info lebih lanjut https://www.drupal.org/docs/8/api/routing-system/using-parameters-in-routes

4k4
sumber
11

Suntikkan RequestStackke dalam pengontrol Anda.

Permintaan saat ini berisi queryatribut yang pada gilirannya berisi parameter GET. requestberisi parameter 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
sumber
4

Anda dapat memeriksa objek Permintaan seperti

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

itu akan mengembalikan GET atau POST atau apa pun. Jika Anda bekerja di dalam suatu objek, ingat untuk DI layanan Permintaan.

ruloweb
sumber
3

Jika Anda menggunakan Content-Type: application/jsonsilakan gunakan:

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

Tidak ada jawaban lain yang bekerja untuk saya, tetapi saya menemukan ini yang berhasil:

$request->getContent();
tukang ojek
sumber
0

Berikut adalah contoh mengakses parameter URL dan meneruskannya ke templat TWIG, saya menganggap Anda telah membuat modul dan file yang diperlukan dan anggap "/ test? Fn = admin" adalah URL Anda

  1. Dalam file .module Anda, implementasikan hook_theme dan tentukan variabel dan nama templat (Pastikan Anda mengganti "_" dengan "-" saat membuat file templat)
function my_module_theme () {   
     return [
      'your_template_name' => [               
         'variables' => [
             'first_name'    => NULL,
          ],   
     ]; 
   }

Sekarang buat controller Anda dan letakkan kode di bawah ini di dalamnya.

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

 }

Sekarang di file TWIG Anda yang seharusnya "my-template.html.twig" Anda dapat mengakses parameter ini sebagai,

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

Dan itu selesai. Semoga ini membantu.

Umesh Patil
sumber