Métodos Magento 2: getPost e getPostValue no objeto de solicitação

9

Vejo que em todos os lugares em que a solicitação está envolvida no Magento 2, a solicitação é uma implementação de \Magento\Framework\App\RequestInterface.
Essa interface não contém os métodos getPost(usados ​​em \Magento\Catalog\Controller\Adminhtml\Category\Widget\CategoriesJson) e getPostValue(usados \Magento\Catalog\Controller\Adminhtml\Product\Save), mas eles ainda são chamados.
Tudo bem supor que esses métodos sempre existam para solicitações http?
ou devo usar outra coisa em meus módulos para obter os $_POSTdados?

Marius
fonte
11
Eu sinto que metade de um ano depois, com Magento 2.1, esta situação ainda não melhorou em tudo :-(
Peedee

Respostas:

4

Tudo bem supor que esses métodos sempre existam para solicitações http?

Não pense assim. Eles estão quebrando seu próprio contrato de classe. Como você pode imaginar, isso não é nada de OOP.

De acordo com a recomendação usual, eu evitaria usar qualquer coisa que não esteja declarada Magento\Framework\App\RequestInterfaceporque: a) você fará Liskov feliz eb) porque logo perceberá o problema e o corrigirá (espero), quebrando assim o seu código (ou não; mas se o fizerem, são justificados: você não estava usando o contrato da API, certo?).

Se eles não corrigirem, terão uma implementação de API muito capaz (ou seja Magento\Framework\App\Request\Http) que ninguém realmente usará.

Sempre fique dentro do contrato!

nevvermind
fonte
Parece uma boa abordagem em um mundo ideal. Infelizmente, não encontrei outra maneira de obter os dados da postagem apenas com métodos RequestInterface. Mas o que você está dizendo parece ressonável. Vou evitar o máximo possível esses métodos.
Marius
Parece que eles estão cientes. Apenas recentemente: github.com/magento/magento2/issues/1675
nevvermind 11/11/2015
Uma maneira fácil de verificar se essas opções estão disponíveis ou não if($this->getRequest() instanceof \Magento\Framework\App\Request\Http) {- se essa verificação for aprovada, você poderá usar esses parâmetros!
Navarr
5

getPostValue() está escrito em

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

então obtém o 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 você consiga pelo menos alguma dica.


E sim, você pode usar

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

Para obter postvalor ,, você também pode verificar o Contactmódulo para obter algumas dicas

Keyur Shah
fonte
11
Obrigado pela "caça ao código". Mas essa não era minha pergunta. Eu já encontrei a definição. Foi por isso que perguntei "sempre haverá solicitações de http?" . Minha pergunta é "É seguro usar esses métodos mesmo se eles não estiverem no RequestInterface?" e isso é usado em qualquer lugar.
Marius
1

Para obter os dados do Post no controlador, você precisa usar o seguinte na sua função de execução.

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

No Magento 2.1, se obtivermos o objeto de solicitação chamando $this->getRequest(), ele retornará o Magento\Framework\App\Requestque é estendido Magento\Framework\HTTP\PhpEnvironment\Request. é por isso que o método getPostValue pode ser chamado.

Eu tive o problema ao tentar criar um teste de unidade para o meu controlador que chame o getPostValue. Como o getPostValue não está definido no RequestInterface, em vez de criar um objeto simulado para o RequestInterface diretamente, criamos o objeto simulado para Magento\Framework\App\Request\Http.

Gump Lei
fonte
-1

Tudo bem supor que esses métodos sempre existam para solicitações http?

Não.

O método será alterado na versão futura se não estiver na interface. Devemos usar os métodos na interface, tanto quanto possível. Devido ao contrato da API, os métodos existentes na API não serão alterados, exceto nas atualizações de versão principais.

Devo usar outra coisa nos meus módulos para obter os dados $ _POST?

Sim.

Na interface Magento\Framework\App\RequestInterface, o método getParams()pode obter a matriz de dados de postagem, o método getParam($key, $defaultValue = null)pode obter os dados específicos na postagem.

Key Shang
fonte