Veo que en todas partes donde la solicitud está involucrada en Magento 2, la solicitud es una implementación de \Magento\Framework\App\RequestInterface
.
Esta interfaz no contiene los métodos getPost
(utilizados en \Magento\Catalog\Controller\Adminhtml\Category\Widget\CategoriesJson
) y getPostValue
(utilizados en \Magento\Catalog\Controller\Adminhtml\Product\Save
) pero todavía se los llama.
¿Está bien suponer que estos métodos siempre estarán ahí para las solicitudes http?
¿O debería usar algo más en mis módulos para obtener los $_POST
datos?
magento2
http-request
Marius
fuente
fuente
Respuestas:
No lo creo Están rompiendo su propio contrato de clase. Como se puede imaginar, eso no es nada de OOP.
Según la recomendación habitual, me mantendría alejado de usar cualquier cosa que no esté declarada
Magento\Framework\App\RequestInterface
porque a) harás feliz a Liskov y porque b) pronto se darán cuenta del problema y lo solucionarán (con suerte), rompiendo así tu código (o no; pero si lo hacen, están justificados: no estabas usando el contrato API, ¿verdad?).Si no lo arreglan, tendrán una implementación de API muy capaz (es decir
Magento\Framework\App\Request\Http
) que nadie usará realmente .¡Manténgase siempre dentro del contrato!
fuente
RequestInterface
. Pero lo que dices suena razonable. Evitaré tanto como sea posible estos métodos.if($this->getRequest() instanceof \Magento\Framework\App\Request\Http) {
: si esa verificación se aprueba, ¡puede usar esos parámetros!getPostValue()
está escrito enlib\internal\Magento\Framework\HTTP\PhpEnvironment\Request.php
entonces obtiene el
getPost
valor devendor\zendframework\zend-http\src\Request.php
Espero que tengas al menos alguna pista.
Y sí, puedes usar
Para obtener
post
valor, también puede consultar elContact
módulo para obtener alguna pistafuente
Para obtener datos de publicación en el controlador, debe usar el siguiente en su función de ejecución.
fuente
En Magento 2.1, si obtenemos el objeto de solicitud llamando
$this->getRequest()
, devolverá loMagento\Framework\App\Request
que se extiendeMagento\Framework\HTTP\PhpEnvironment\Request
. Por eso se puede llamar al método getPostValue.Tengo el problema cuando intento crear una prueba unitaria para mi controlador que llama al getPostValue. Como getPostValue no está definido en RequestInterface, en lugar de crear un objeto simulado para RequestInterface directamente, creamos el objeto simulado para
Magento\Framework\App\Request\Http
.fuente
No.
El método se cambiará en la versión futura si no está en la interfaz. Deberíamos usar los métodos en la interfaz tanto como sea posible. Debido al contrato de API, los métodos existentes en API no se cambiarán excepto en las actualizaciones de versiones principales.
Si.
En la interfaz
Magento\Framework\App\RequestInterface
, el métodogetParams()
podría obtener la matriz de datos de publicación, el métodogetParam($key, $defaultValue = null)
podría obtener los datos específicos en la publicación.fuente