Magento 2: phương thức getPost và getPostValue trên đối tượng yêu cầu


9

Tôi thấy rằng ở mọi nơi mà yêu cầu có liên quan đến Magento 2, yêu cầu là việc thực hiện \Magento\Framework\App\RequestInterface.
Giao diện này không chứa các phương thức getPost(được sử dụng trong \Magento\Catalog\Controller\Adminhtml\Category\Widget\CategoriesJson) và getPostValue(được sử dụng trong \Magento\Catalog\Controller\Adminhtml\Product\Save) nhưng chúng vẫn được gọi.
Bạn có thể cho rằng các phương thức này luôn luôn có mặt cho các yêu cầu http không?
hoặc tôi nên sử dụng cái gì khác trong các mô-đun của mình để lấy $_POSTdữ liệu?


1
Tôi cảm thấy rằng nửa năm sau, với Magento 2.1, tình trạng này vẫn không được cải thiện chút nào :-(
peedee

Câu trả lời:


4

Bạn có thể cho rằng các phương thức này luôn luôn có mặt cho các yêu cầu http không?

Đừng nghĩ vậy. Họ đang phá vỡ hợp đồng lớp học của riêng họ. Như bạn có thể tưởng tượng, đó hoàn toàn không phải là OOP-ish.

Theo khuyến nghị thông thường, tôi sẽ tránh sử dụng bất cứ thứ gì không được khai báo Magento\Framework\App\RequestInterfacevì a) bạn sẽ khiến Liskov hài lòng và vì b) họ sẽ sớm nhận ra vấn đề và khắc phục (hy vọng), do đó phá vỡ mã của bạn (hoặc không phải, nhưng nếu có, họ sẽ hợp lý: bạn không sử dụng hợp đồng API, phải không?).

Nếu họ không sửa nó, họ sẽ có một triển khai API rất có khả năng (nghĩa là Magento\Framework\App\Request\Http) mà không ai sẽ thực sự sử dụng.

Luôn luôn ở trong hợp đồng!


Điều này có vẻ như một cách tiếp cận tốt trong một thế giới lý tưởng. Thật không may, tôi không tìm thấy cách nào khác để lấy dữ liệu bài đăng bằng các phương thức chỉ từ RequestInterface. Nhưng những gì bạn đang nói âm thanh có thể cộng hưởng. Tôi sẽ tránh càng nhiều càng tốt các phương pháp này.
Marius

Có vẻ như họ biết. Chỉ gần đây: github.com/magento/magento2/issues/1675
nevvermind

Một cách dễ dàng để kiểm tra xem những thứ đó có sẵn cho bạn hay không là thực hiện if($this->getRequest() instanceof \Magento\Framework\App\Request\Http) {- nếu kiểm tra đó vượt qua, bạn có thể sử dụng các tham số đó!
Navarr

5

getPostValue() được viết bằng

lib\internal\Magento\Framework\HTTP\PhpEnvironment\Request.php

 /**
     * Retrieve POST parameters
     *
     * @param string $name
     * @param mixed $default
     * @return mixed|ParametersInterface
     */
    public function getPostValue($name = null, $default = null)
    {
        $post = $this->getPost($name, $default);
        if ($post instanceof ParametersInterface) {
            return $post->toArray();
        }
        return $post;
    }

sau đó nó nhận được getPostgiá trị từ

vendor\zendframework\zend-http\src\Request.php

public function getPost($name = null, $default = null)
    {
        if ($this->postParams === null) {
            $this->postParams = new Parameters();
        }

        if ($name === null) {
            return $this->postParams;
        }

        return $this->postParams->get($name, $default);
    }

Hy vọng bạn sẽ nhận được ít nhất một số gợi ý.


Và vâng, bạn có thể sử dụng

$post = $this->getRequest()->getPostValue();

Để có được postgiá trị ,, bạn cũng có thể kiểm tra Contactmô-đun để có được một số gợi ý


1
Cảm ơn bạn đã "săn mã". Nhưng đó không phải là câu hỏi của tôi. Tôi đã tìm thấy định nghĩa. Đó là lý do tại sao tôi hỏi "luôn luôn có mặt cho các yêu cầu http?" . Câu hỏi của tôi là "Có an toàn khi sử dụng các phương thức này ngay cả khi chúng không có trong RequestInterface không?" và điều này được sử dụng ở mọi nơi.
Marius

1

Để có được dữ liệu Đăng trong bộ điều khiển, bạn cần sử dụng hàm sau trong hàm thực thi.

public function execute(){
    $post = $this->getRequest()->getPostValue();
    echo "<pre>";
    print_r($post);
    exit; }

0

Trong Magento 2.1, nếu chúng ta nhận được đối tượng yêu cầu bằng cách gọi $this->getRequest(), nó sẽ trả về Magento\Framework\App\Requestphần mở rộng Magento\Framework\HTTP\PhpEnvironment\Request. đây là lý do tại sao phương thức getPostValue có thể được gọi.

Tôi gặp vấn đề khi tôi cố gắng tạo một bài kiểm tra đơn vị cho bộ điều khiển của mình, gọi hàm getPostValue. Vì getPostValue không được xác định trong RequestInterface, thay vì trực tiếp tạo một đối tượng giả cho RequestInterface, chúng tôi tạo đối tượng giả cho Magento\Framework\App\Request\Http.


-1

Bạn có thể cho rằng các phương thức này luôn luôn có mặt cho các yêu cầu http không?

Không.

Phương thức sẽ được thay đổi trong phiên bản tương lai nếu nó không có trong giao diện. Chúng ta nên sử dụng các phương thức trong giao diện càng nhiều càng tốt. Do hợp đồng API, các phương thức hiện có trong API sẽ không bị thay đổi ngoại trừ trong các nâng cấp phiên bản chính.

Tôi có nên sử dụng một cái gì đó khác trong các mô-đun của mình để lấy dữ liệu $ _POST không?

Đúng.

Trong giao diện Magento\Framework\App\RequestInterface, phương thức getParams()có thể lấy mảng dữ liệu bài, phương thức getParam($key, $defaultValue = null)có thể lấy dữ liệu cụ thể trong bài.

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.