Magento 2: metodi getPost e getPostValue sull'oggetto richiesta


9

Vedo che ovunque la richiesta è coinvolta in Magento 2, la richiesta è un'implementazione di \Magento\Framework\App\RequestInterface.
Questa interfaccia non contiene i metodi getPost(usato in \Magento\Catalog\Controller\Adminhtml\Category\Widget\CategoriesJson) e getPostValue(usato dentro \Magento\Catalog\Controller\Adminhtml\Product\Save) ma sono comunque chiamati.
Va bene supporre che questi metodi saranno sempre presenti per le richieste http?
o dovrei usare qualcos'altro nei miei moduli per ottenere i $_POSTdati?


1
Sento che mezzo anno dopo, con Magento 2.1, questa situazione non è ancora migliorata affatto :-(
peedee

Risposte:


4

Va bene supporre che questi metodi saranno sempre presenti per le richieste http?

Non la penso così. Stanno rompendo il loro contratto di classe. Come puoi immaginare, non è affatto OOP-ish.

Come da consueto consiglio, starei lontano dall'usare qualsiasi cosa non dichiarata Magento\Framework\App\RequestInterfaceperché a) renderai felice Liskov e perché b) realizzeranno presto il problema e lo risolveranno (si spera), infrangendo così il tuo codice (o no; ma se lo fanno, sono giustificati: non stavi usando il contratto API, giusto?).

Se non lo risolveranno, avranno un'implementazione dell'API (cioè Magento\Framework\App\Request\Http) molto capace che nessuno utilizzerà davvero .

Rimani sempre all'interno del contratto!


Sembra un buon approccio in un mondo ideale. Purtroppo non ho trovato altro modo per ottenere i dati di post con metodi solo dal RequestInterface. Ma quello che stai dicendo sembra risonabile. Eviterò il più possibile questi metodi.
Marius

Sembra che siano a conoscenza. Solo di recente: github.com/magento/magento2/issues/1675
nevvermind

Un modo semplice per verificare se quelli sono disponibili per te sarebbe quello di fare un if($this->getRequest() instanceof \Magento\Framework\App\Request\Http) {- se quel controllo passa, puoi usare quei parametri!
Navarr,

5

getPostValue() è scritto 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;
    }

quindi ottiene il getPostvalore da

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

Spero che tu abbia almeno qualche suggerimento.


E sì, puoi usare

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

Per ottenere postvalore, puoi anche controllare il Contactmodulo per avere qualche suggerimento


1
Grazie per la "caccia al codice". Ma questa non era la mia domanda. Ho già trovato la definizione. Ecco perché ho chiesto "ci saranno sempre richieste HTTP?" . La mia domanda è "È sicuro utilizzare questi metodi anche se non si trovano in RequestInterface?" e questo è usato ovunque.
Marius

1

Per ottenere i dati Post nel controller devi usare quanto segue nella tua funzione di esecuzione.

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

0

In Magento 2.1, se otteniamo l'oggetto richiesta chiamando $this->getRequest(), restituirà Magento\Framework\App\Requestquale è estensione Magento\Framework\HTTP\PhpEnvironment\Request. ecco perché è possibile chiamare il metodo getPostValue.

Ho riscontrato il problema quando provo a creare un test unitario per il mio controller che chiama getPostValue. Poiché getPostValue non è definito in RequestInterface, anziché creare direttamente un oggetto finto per RequestInterface, creiamo l'oggetto finto per Magento\Framework\App\Request\Http.


-1

Va bene supporre che questi metodi saranno sempre presenti per le richieste http?

No.

Il metodo verrà modificato nella versione futura se non è nell'interfaccia. Dovremmo usare i metodi nell'interfaccia il più possibile. A causa del contratto API, i metodi esistenti nell'API non verranno modificati se non negli aggiornamenti della versione principale.

Dovrei usare qualcos'altro nei miei moduli per ottenere i dati $ _POST?

Sì.

Nell'interfaccia Magento\Framework\App\RequestInterface, il metodo getParams()potrebbe ottenere l'array di dati post, il metodo getParam($key, $defaultValue = null)potrebbe ottenere i dati specifici in post.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.