Magento 2: Methoden getPost und getPostValue für das Anforderungsobjekt

9

Ich sehe, dass überall dort, wo die Anfrage in Magento 2 involviert ist, die Anfrage eine Implementierung von ist \Magento\Framework\App\RequestInterface.
Diese Schnittstelle enthält nicht die Methoden getPost(verwendet in \Magento\Catalog\Controller\Adminhtml\Category\Widget\CategoriesJson) und getPostValue(verwendet in \Magento\Catalog\Controller\Adminhtml\Product\Save), aber sie werden immer noch aufgerufen.
Ist es in Ordnung anzunehmen, dass diese Methoden immer für http-Anfragen zur Verfügung stehen?
oder sollte ich etwas anderes in meinen Modulen verwenden, um die $_POSTDaten zu erhalten?

Marius
quelle
1
Ich habe das Gefühl, dass sich diese Situation ein halbes Jahr später mit Magento 2.1 überhaupt nicht verbessert hat :-(
Peedee

Antworten:

4

Ist es in Ordnung anzunehmen, dass diese Methoden immer für http-Anfragen zur Verfügung stehen?

Glaube nicht. Sie brechen ihren eigenen Klassenvertrag. Wie Sie sich vorstellen können, ist das überhaupt nicht OOP-ish.

Gemäß der üblichen Empfehlung würde ich mich von allem fernhalten, was nicht deklariert ist, Magento\Framework\App\RequestInterfaceweil a) Sie Liskov glücklich machen und b) sie das Problem bald erkennen und es (hoffentlich) beheben und so Ihren Code brechen (oder nicht; aber wenn doch, sind sie gerechtfertigt: Sie haben den API-Vertrag nicht verwendet, oder?).

Wenn sie es nicht beheben, haben sie eine sehr leistungsfähige API-Implementierung (dh Magento\Framework\App\Request\Http), die niemand wirklich verwenden wird.

Immer im Vertrag bleiben!

nieverstand
quelle
Dies scheint ein guter Ansatz in einer idealen Welt zu sein. Leider habe ich keinen anderen Weg gefunden, um die Postdaten mit Methoden nur von der zu bekommen RequestInterface. Aber was Sie sagen, klingt vernünftig. Ich werde diese Methoden so weit wie möglich vermeiden.
Marius
Es sieht so aus, als wären sie sich dessen bewusst. Erst kürzlich: github.com/magento/magento2/issues/1675
Nevvermind
Eine einfache Möglichkeit, um zu überprüfen, ob diese für Sie verfügbar sind oder nicht, besteht darin, Folgendes zu tun if($this->getRequest() instanceof \Magento\Framework\App\Request\Http) {: Wenn diese Prüfung erfolgreich ist, können Sie diese Parameter verwenden!
Navarr
5

getPostValue() ist geschrieben in

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

dann bekommt es den getPostWert von

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

Ich hoffe, Sie bekommen zumindest einen Hinweis.


Und ja, du kannst verwenden

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

Um einen postWert zu erhalten, können Sie auch das ContactModul überprüfen , um einen Hinweis zu erhalten

Keyur Shah
quelle
1
Danke für die "Code-Jagd". Das war aber nicht meine Frage. Ich habe die Definition bereits gefunden. Deshalb habe ich gefragt: "Werden Sie immer für http-Anfragen da sein?" . Meine Frage lautet: "Ist es sicher, diese Methoden zu verwenden, auch wenn sie nicht im RequestInterface enthalten sind?" und das wird überall verwendet.
Marius
1

Um Post-Daten im Controller abzurufen, müssen Sie in Ihrer Ausführungsfunktion Folgendes verwenden.

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

Wenn wir in Magento 2.1 das Anforderungsobjekt durch Aufrufen erhalten $this->getRequest(), wird es zurückgegeben, Magento\Framework\App\Requestwas erweitert ist Magento\Framework\HTTP\PhpEnvironment\Request. Aus diesem Grund kann die Methode getPostValue aufgerufen werden.

Ich habe das Problem, wenn ich versuche, einen Komponententest für meinen Controller zu erstellen, der getPostValue aufruft. Da getPostValue nicht im RequestInterface definiert ist, erstellen wir das Mock-Objekt für RequestInterface nicht direkt, sondern direkt Magento\Framework\App\Request\Http.

Gump Lei
quelle
-1

Ist es in Ordnung anzunehmen, dass diese Methoden immer für http-Anfragen zur Verfügung stehen?

Nein.

Die Methode wird in der zukünftigen Version geändert, wenn sie nicht in der Schnittstelle enthalten ist. Wir sollten die Methoden in der Schnittstelle so oft wie möglich verwenden. Aufgrund des API-Vertrags werden vorhandene Methoden in der API nur bei größeren Versions-Upgrades geändert.

Sollte ich in meinen Modulen etwas anderes verwenden, um die $ _POST-Daten abzurufen?

Ja.

In der Schnittstelle könnte Magento\Framework\App\RequestInterfacedie Methode getParams()das Post-Daten-Array abrufen, die Methode getParam($key, $defaultValue = null)könnte die spezifischen Daten in Post abrufen.

Schlüssel Shang
quelle