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 $_POST
Daten zu erhalten?
magento2
http-request
Marius
quelle
quelle
Antworten:
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\RequestInterface
weil 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!
quelle
RequestInterface
. Aber was Sie sagen, klingt vernünftig. Ich werde diese Methoden so weit wie möglich vermeiden.if($this->getRequest() instanceof \Magento\Framework\App\Request\Http) {
: Wenn diese Prüfung erfolgreich ist, können Sie diese Parameter verwenden!getPostValue()
ist geschrieben inlib\internal\Magento\Framework\HTTP\PhpEnvironment\Request.php
dann bekommt es den
getPost
Wert vonvendor\zendframework\zend-http\src\Request.php
Ich hoffe, Sie bekommen zumindest einen Hinweis.
Und ja, du kannst verwenden
Um einen
post
Wert zu erhalten, können Sie auch dasContact
Modul überprüfen , um einen Hinweis zu erhaltenquelle
Um Post-Daten im Controller abzurufen, müssen Sie in Ihrer Ausführungsfunktion Folgendes verwenden.
quelle
Wenn wir in Magento 2.1 das Anforderungsobjekt durch Aufrufen erhalten
$this->getRequest()
, wird es zurückgegeben,Magento\Framework\App\Request
was erweitert istMagento\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
.quelle
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.
Ja.
In der Schnittstelle könnte
Magento\Framework\App\RequestInterface
die MethodegetParams()
das Post-Daten-Array abrufen, die MethodegetParam($key, $defaultValue = null)
könnte die spezifischen Daten in Post abrufen.quelle