Magento 2: métodos getPost y getPostValue en el objeto de solicitud

9

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 $_POSTdatos?

Marius
fuente
1
Siento que medio año después, con Magento 2.1, esta situación aún no ha mejorado en absoluto :-(
peedee

Respuestas:

4

¿Está bien suponer que estos métodos siempre estarán ahí para las solicitudes http?

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\RequestInterfaceporque 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!

nevvermind
fuente
Esto parece un buen enfoque en un mundo ideal. Desafortunadamente, no encontré otra forma de obtener los datos de la publicación con métodos solo del RequestInterface. Pero lo que dices suena razonable. Evitaré tanto como sea posible estos métodos.
Marius
Parece que están al tanto. Solo recientemente: github.com/magento/magento2/issues/1675
nevvermind
Una manera fácil de verificar si están disponibles para usted sería hacer un if($this->getRequest() instanceof \Magento\Framework\App\Request\Http) {: si esa verificación se aprueba, ¡puede usar esos parámetros!
Navarr
5

getPostValue() está escrito en

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

entonces obtiene el getPostvalor de

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

Espero que tengas al menos alguna pista.


Y sí, puedes usar

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

Para obtener postvalor, también puede consultar el Contactmódulo para obtener alguna pista

Keyur Shah
fuente
1
Gracias por la "búsqueda de código". Pero esa no era mi pregunta. Ya encontré la definición. Es por eso que pregunté "¿siempre estarán allí para solicitudes http?" . Mi pregunta es "¿Es seguro usar estos métodos incluso si no están en la interfaz de solicitud?" y esto se usa en todas partes.
Marius
1

Para obtener datos de publicación en el controlador, debe usar el siguiente en su función de ejecución.

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

En Magento 2.1, si obtenemos el objeto de solicitud llamando $this->getRequest(), devolverá lo Magento\Framework\App\Requestque se extiende Magento\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.

Gump Lei
fuente
-1

¿Está bien suponer que estos métodos siempre estarán ahí para las solicitudes http?

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.

¿Debo usar algo más en mis módulos para obtener los datos $ _POST?

Si.

En la interfaz Magento\Framework\App\RequestInterface, el método getParams()podría obtener la matriz de datos de publicación, el método getParam($key, $defaultValue = null)podría obtener los datos específicos en la publicación.

Key Shang
fuente