วิธีรับพารามิเตอร์ $ _POST และ $ _GET


26

ฉัน ajaxly โทรเส้นทางและส่งผ่านข้อมูลไปในการควบคุมของฉันฉันต้องการที่จะได้รับ$_POST['var'], $_POST['var2']ดูเหมือนว่าเนื่องจากการใช้ HttpFoundation ใน Drupal 8 $_POSTและ$_GETยังไม่ได้มีอยู่ในวิธีการเก่าฉันจะสามารถเข้าถึง$_POSTพารามิเตอร์ในการควบคุมที่กำหนดเอง?


2
ยังมี $ _POST อยู่คุณไม่ควรใช้มันโดยตรง ถ้า $ _POST ว่างเปล่าวัตถุคำขอก็จะว่างเปล่าและข้อผิดพลาดของคุณจะเกิดขึ้นก่อนหน้านี้ บ่อยครั้งเป็นเช่นนี้เพราะ mod_rewrite ไม่ได้เปิดใช้งาน / กำหนดค่าอย่างถูกต้องและหน้านั้นถูกเปลี่ยนเส้นทางผ่านทางคำสั่งไม่พบซึ่งจะลดลงโพสต์ข้อมูล
Berdir

คำตอบ:


62

จากบันทึกการเปลี่ยนแปลง :

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

กลายเป็น

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

บังเอิญสำหรับGETvars คุณจะใช้:

$query = \Drupal::request()->query->get('name');

1
ขอบคุณและคุณรู้หรือไม่ว่าฉันจะได้รับสิ่งของทั้งหมดได้อย่างไร ฉันหมายถึง $ _POST ไม่ใช่หนึ่งรายการ
Yusef

3
ฉันไม่ได้ตรวจสอบ แต่รู้ Symfony ฉันจะถือว่า:\Drupal::request()->request->all()
Clive

2
ขอขอบคุณที่นี้เป็นคำตอบที่แท้จริงให้กับคำถามของฉัน แต่ฉันไม่ได้รับผลที่คาดหวัง (อาจจะมีปัญหาในสถานที่อื่นผมถามในคำถามอื่น.
Yusef

1
ฉันสามารถยืนยันได้ว่าคุณสามารถใช้ \ Drupal :: request () -> query-> all () เพื่อรับตัวแปร $ _GET ทั้งหมด
ตกลง

29

ในคอนโทรลเลอร์รับคำร้องขอพร้อมอาร์กิวเมนต์แบบบอกใบ้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];
  }

}

ข้อมูลเพิ่มเติมhttps://www.drupal.org/docs/8/api/routing-system/using-parameters-in-routes


11

ฉีดRequestStackเข้าไปในตัวควบคุมของคุณ

คำขอปัจจุบันมีqueryแอตทริบิวต์ที่จะมีพารามิเตอร์ GET requestมีพารามิเตอร์ 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');
  }

}

4

คุณสามารถตรวจสอบคำขอวัตถุเช่น

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

มันจะส่งคืน GET หรือ POST หรืออะไรก็ตาม หากคุณกำลังทำงานภายในวัตถุอย่าลืม DI บริการร้องขอ



2

ไม่มีคำตอบอื่นที่เหมาะกับฉัน แต่ฉันพบสิ่งนี้:

$request->getContent();

0

นี่คือตัวอย่างของการเข้าถึงพารามิเตอร์ URL และส่งต่อไปยังเทมเพลต TWIG ฉันกำลังพิจารณาว่าคุณได้สร้างโมดูลและไฟล์ที่ต้องการแล้วและสมมติว่า "/ test? fn = admin" คือ URL ของคุณ

  1. ในไฟล์. โมดูลของคุณให้ใช้ hook_theme และกำหนดตัวแปรและชื่อเทมเพลต (ตรวจสอบให้แน่ใจว่าคุณได้แทนที่ "_" ด้วย "-" เมื่อสร้างไฟล์เทมเพลต)
function my_module_theme () {   
     return [
      'your_template_name' => [               
         'variables' => [
             'first_name'    => NULL,
          ],   
     ]; 
   }

ตอนนี้สร้างคอนโทรลเลอร์ของคุณแล้วใส่โค้ดด้านล่างลงไป

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

 }

ตอนนี้ในไฟล์ TWIG ของคุณซึ่งควรจะเป็น "my-template.html.twig" คุณสามารถเข้าถึงพารามิเตอร์นี้ได้เช่น

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

และมันทำ หวังว่านี่จะช่วยได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.