Magento 2: méthodes getPost et getPostValue sur l'objet de requête


9

Je vois que partout où la demande est impliquée dans Magento 2, la demande est une implémentation de \Magento\Framework\App\RequestInterface.
Cette interface ne contient pas les méthodes getPost(utilisées dans \Magento\Catalog\Controller\Adminhtml\Category\Widget\CategoriesJson) et getPostValue(utilisées dans \Magento\Catalog\Controller\Adminhtml\Product\Save) mais elles sont toujours appelées.
Est-il OK de supposer que ces méthodes seront toujours là pour les requêtes http?
ou devrais-je utiliser autre chose dans mes modules pour obtenir les $_POSTdonnées?


1
Je pense que
six

Réponses:


4

Est-il OK de supposer que ces méthodes seront toujours là pour les requêtes http?

Ne pense pas. Ils rompent leur propre contrat de classe. Comme vous pouvez l'imaginer, ce n'est pas du tout OOP-ish.

Selon la recommandation habituelle, je resterais à l'écart de tout ce qui n'est pas déclaré Magento\Framework\App\RequestInterfacecar a) vous ferez plaisir à Liskov et parce que b) ils se rendront vite compte du problème et le corrigeront (espérons-le), cassant ainsi votre code (ou non; mais s'ils le font, ils sont justifiés: vous n'utilisiez pas le contrat API, non?).

S'ils ne le résolvent pas, ils auront une implémentation d'API très performante (c'est-à-dire Magento\Framework\App\Request\Http) que personne n'utilisera vraiment .

Restez toujours dans le contrat!


Cela ressemble à une bonne approche dans un monde idéal. Malheureusement, je n'ai trouvé aucun autre moyen d'obtenir les données de publication avec des méthodes provenant uniquement de RequestInterface. Mais ce que vous dites semble raisonnable. J'éviterai autant que possible ces méthodes.
Marius

On dirait qu'ils sont conscients. Récemment: github.com/magento/magento2/issues/1675
nevvermind

Un moyen facile de vérifier si ceux-ci sont à votre disposition serait de faire un if($this->getRequest() instanceof \Magento\Framework\App\Request\Http) {- si ce contrôle réussit, vous pouvez utiliser ces paramètres!
Navarr

5

getPostValue() est écrit 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;
    }

alors il obtient la getPostvaleur 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);
    }

J'espère que vous obtiendrez au moins un indice.


Et oui, vous pouvez utiliser

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

Pour obtenir de la postvaleur, vous pouvez également vérifier le Contactmodule pour obtenir un indice


1
Merci pour la "chasse au code". Mais ce n'était pas ma question. J'ai déjà trouvé la définition. C'est pourquoi j'ai demandé "vont toujours être là pour les requêtes http?" . Ma question est "Est-il sûr d'utiliser ces méthodes même si elles ne sont pas dans la RequestInterface?" et cela est utilisé partout.
Marius

1

Pour obtenir des données Post dans le contrôleur, vous devez utiliser les éléments suivants dans votre fonction d'exécution.

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

0

Dans Magento 2.1, si nous obtenons l'objet de requête en appelant $this->getRequest(), il retournera Magento\Framework\App\Requestce qui est étendu Magento\Framework\HTTP\PhpEnvironment\Request. c'est pourquoi la méthode getPostValue peut être appelée.

J'ai eu le problème lorsque j'essaie de créer un test unitaire pour mon contrôleur qui appelle la getPostValue. Comme getPostValue n'est pas défini dans RequestInterface, au lieu de créer directement un objet factice pour RequestInterface, nous créons l'objet factice pour Magento\Framework\App\Request\Http.


-1

Est-il OK de supposer que ces méthodes seront toujours là pour les requêtes http?

Non.

La méthode sera modifiée dans la future version si elle n'est pas dans l'interface. Nous devons utiliser autant que possible les méthodes de l'interface. En raison du contrat d'API, les méthodes existantes dans l'API ne seront pas modifiées, sauf dans les mises à niveau de versions majeures.

Dois-je utiliser autre chose dans mes modules pour obtenir les données $ _POST?

Oui.

Dans l'interface Magento\Framework\App\RequestInterface, la méthode getParams()pourrait obtenir le tableau de données post, la méthode getParam($key, $defaultValue = null)pourrait obtenir les données spécifiques dans post.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.