Cách nhận tham số $ _POST và $ _GET


22

Tôi thường gọi một tuyến đường và truyền dữ liệu cho nó, Trong bộ điều khiển của tôi, tôi muốn nhận $_POST['var'], $_POST['var2']có vẻ như vì sử dụng HttpFoundation trong drupal 8 $_POST$_GETkhông tồn tại trong phương thức cũ, Làm cách nào tôi có thể truy cập $_POSTcác tham số trong Trình điều khiển tùy chỉnh?


2
$ _POST vẫn tồn tại, bạn chỉ cần không sử dụng trực tiếp. Nếu $ _POST trống, thì đối tượng yêu cầu cũng sẽ trống và lỗi của bạn xảy ra sớm hơn. Thông thường, đây là ví dụ vì mod_rewrite không được bật / định cấu hình chính xác và trang được chuyển hướng thông qua lệnh không tìm thấy, làm giảm dữ liệu bài đăng.
Berdir

Câu trả lời:


58

Từ hồ sơ thay đổi :

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

trở thành

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

Ngẫu nhiên, đối với GETvars, bạn sẽ sử dụng:

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

1
cảm ơn, và bạn có biết làm thế nào tôi có thể nhận được tất cả các mặt hàng? Ý tôi là $ _POST hoàn toàn không phải là một mặt hàng.
Yusef

3
Tôi chưa kiểm tra, nhưng biết Symfony tôi giả sử:\Drupal::request()->request->all()
Clive

2
Cảm ơn, đây là câu trả lời đúng cho câu hỏi của tôi mặc dù tôi không nhận được kết quả như mong đợi (có thể có vấn đề ở một nơi khác, tôi hỏi nó trong một câu hỏi khác.
Yusef

1
Tôi có thể xác nhận rằng bạn có thể sử dụng \ Drupal :: request () -> query-> all () để nhận tất cả các biến $ _GET.
oknate

27

Trong bộ điều khiển nhận yêu cầu với một đối số gợi ý kiểu 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];
  }

}

Thông tin thêm https://www.drupal.org/docs/8/api/routing-system/USE-parameter-in-routes


11

Tiêm RequestStackvào bộ điều khiển của bạn.

Yêu cầu hiện tại chứa querythuộc tính lần lượt chứa các tham số GET. requestchứa các tham số 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

Bạn có thể kiểm tra đối tượng Yêu cầu như

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

nó sẽ trả về GET hoặc POST hoặc bất cứ điều gì. Nếu bạn đang làm việc bên trong một đối tượng, hãy nhớ DI dịch vụ Yêu cầu.


3

Nếu bạn đang sử dụng Content-Type: application/jsonxin vui lòng sử dụng:

$post_data = json_decode( $this->request->getContent(),TRUE);

2

Không có câu trả lời nào khác làm việc cho tôi nhưng tôi thấy điều này đã làm:

$request->getContent();

0

Đây là ví dụ về việc truy cập các tham số URL và chuyển chúng vào mẫu TWIG, tôi đang xem xét bạn đã tạo mô-đun và các tệp cần thiết và giả sử "/ test? Fn = admin" là URL của bạn

  1. Trong tệp .module của bạn triển khai hook_theme và xác định các biến và tên mẫu (Đảm bảo bạn thay thế "_" bằng "-" khi tạo tệp mẫu)
function my_module_theme () {   
     return [
      'your_template_name' => [               
         'variables' => [
             'first_name'    => NULL,
          ],   
     ]; 
   }

Bây giờ tạo bộ điều khiển của bạn và đặt mã dưới đây.

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

 }

Bây giờ trong tệp TWIG của bạn phải là "my-template.html.twig", bạn có thể truy cập tham số này dưới dạng,

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

Và nó đã được thực hiện. Hi vọng điêu nay co ich.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.