Magento 2: metode getPost dan getPostValue pada objek permintaan

9

Saya melihat bahwa di mana pun di mana permintaan terlibat dalam Magento 2, permintaan tersebut merupakan implementasi dari \Magento\Framework\App\RequestInterface.
Antarmuka ini tidak mengandung metode getPost(digunakan dalam \Magento\Catalog\Controller\Adminhtml\Category\Widget\CategoriesJson) dan getPostValue(digunakan dalam \Magento\Catalog\Controller\Adminhtml\Product\Save) tetapi mereka masih dipanggil.
Apakah boleh untuk menganggap bahwa metode ini akan selalu ada untuk permintaan http?
atau haruskah saya menggunakan sesuatu yang lain dalam modul saya untuk mendapatkan $_POSTdata?

Marius
sumber
1
Saya merasa bahwa setengah tahun kemudian, dengan Magento 2.1, situasi ini masih belum membaik sama sekali :-(
peedee

Jawaban:

4

Apakah boleh untuk menganggap bahwa metode ini akan selalu ada untuk permintaan http?

Jangan berpikir begitu. Mereka melanggar kontrak kelas mereka sendiri. Seperti yang dapat Anda bayangkan, itu sama sekali bukan OOP.

Sesuai rekomendasi biasa, saya akan tinggal jauh dari menggunakan apa pun yang tidak dinyatakan dalam Magento\Framework\App\RequestInterfacekarena a) Anda akan membuat Liskov bahagia dan karena b) mereka akan segera menyadari masalah dan memperbaikinya (mudah-mudahan), sehingga melanggar kode Anda (atau tidak; tetapi jika mereka melakukannya, mereka dibenarkan: Anda tidak menggunakan kontrak API, kan?).

Jika mereka tidak akan memperbaikinya, mereka akan memiliki implementasi API sangat mampu (yaitu Magento\Framework\App\Request\Http) yang tak seorang pun akan benar-benar menggunakan.

Selalu tetap dalam kontrak!

nevvermind
sumber
Ini terlihat seperti pendekatan yang baik di dunia yang ideal. Sayangnya saya tidak menemukan cara lain untuk mendapatkan data posting hanya dengan metode RequestInterface. Tapi apa yang Anda katakan terdengar resonable. Saya akan menghindari sebanyak mungkin metode ini.
Marius
Sepertinya mereka sadar. Hanya baru-baru ini: github.com/magento/magento2/issues/1675
nevvermind
Cara mudah untuk memeriksa apakah tersedia atau tidak untuk Anda adalah dengan melakukan if($this->getRequest() instanceof \Magento\Framework\App\Request\Http) {- jika pemeriksaan itu berlalu, Anda dapat menggunakan parameter itu!
Navarr
5

getPostValue() ditulis dalam bahasa

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

maka itu mendapatkan getPostnilai dari

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);
    }

Semoga Anda mendapatkan sedikit petunjuk.


Dan ya bisa Anda gunakan

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

Untuk mendapatkan postnilai ,, Anda juga dapat memeriksa Contactmodul untuk mendapatkan beberapa petunjuk

Keyur Shah
sumber
1
Terima kasih untuk "perburuan kode". Tapi itu bukan pertanyaan saya. Saya sudah menemukan definisi. Itu sebabnya saya bertanya "apakah akan selalu ada untuk permintaan http?" . Pertanyaan saya adalah "Apakah aman untuk menggunakan metode ini bahkan jika mereka tidak ada di RequestInterface?" dan ini digunakan di mana-mana.
Marius
1

Untuk mendapatkan data Posting di pengontrol, Anda perlu menggunakan berikut dalam fungsi eksekusi Anda.

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

Di Magento 2.1, jika kita mendapatkan objek permintaan dengan menelepon $this->getRequest(), itu akan mengembalikan Magento\Framework\App\Requestyang diperluas Magento\Framework\HTTP\PhpEnvironment\Request. inilah mengapa metode getPostValue dapat dipanggil.

Saya mendapat masalah ketika saya mencoba membuat unit test untuk controller saya yang memanggil getPostValue. Karena getPostValue tidak didefinisikan dalam RequestInterface, Alih-alih membuat objek tiruan untuk RequestInterface secara langsung, kami membuat objek tiruan untuk Magento\Framework\App\Request\Http.

Gump Lei
sumber
-1

Apakah boleh untuk menganggap bahwa metode ini akan selalu ada untuk permintaan http?

Tidak.

Metode ini akan diubah di versi masa depan jika tidak ada di antarmuka. Kita harus menggunakan metode di antarmuka sebanyak mungkin. Karena kontrak API, metode yang ada di API tidak akan diubah kecuali dalam peningkatan versi utama.

Haruskah saya menggunakan sesuatu yang lain dalam modul saya untuk mendapatkan data $ _POST?

Iya.

Dalam antarmuka Magento\Framework\App\RequestInterface, metode getParams()bisa mendapatkan array data posting, metode ini getParam($key, $defaultValue = null)bisa mendapatkan data spesifik dalam posting.

Key Shang
sumber