Magento 2:リクエストオブジェクトのgetPostおよびgetPostValueメソッド


9

リクエストがMagento 2に関係するすべての場所で、リクエストがの実装であることがわかり\Magento\Framework\App\RequestInterfaceます。
このインターフェイスにはメソッドgetPost(で使用\Magento\Catalog\Controller\Adminhtml\Category\Widget\CategoriesJson)およびgetPostValue(で使用)は含まれていませんが、\Magento\Catalog\Controller\Adminhtml\Product\Saveそれらは引き続き呼び出されます。
これらのメソッドが常にhttpリクエストのために存在することを想定しても問題ありませんか?
または、$_POSTデータを取得するためにモジュールで他の何かを使用する必要がありますか?


1
Magento 2.1を使用して半年後、この状況はまだまったく改善されていないと感じます:-(
peedee

回答:


4

これらのメソッドが常にhttpリクエストのために存在すると想定しても問題ありませんか?

そう思わないでください。彼らは自分のクラス契約を破っています。ご想像のとおり、それはまったくOOP風ではありません。

通常の推奨に従って、私は宣言されていないものを使用しないようにMagento\Framework\App\RequestInterfaceます。理由は、a)Liskovを幸せにし、b)すぐに問題を認識して修正する(うまくいけば)ため、コードが壊れる(またはそうではありませんが、そうであれば正当化されます。APIコントラクトを使用していませんでしたよね?)。

彼らがそれを修正しない場合、彼らは実際にMagento\Framework\App\Request\Http誰も使用しない非常に有能なAPI実装(つまり)を持っているでしょう。

常に契約の範囲内にとどまってください!


これは理想的な世界では良いアプローチのように見えます。残念ながら、からのみのメソッドで投稿データを取得する他の方法は見つかりませんでしたRequestInterface。しかし、あなたが言っていることは共感を呼びます。これらの方法は極力避けます。
マリウス

彼らは気づいているようです。最近のみ:github.com/magento/magento2/issues/1675
nevvermind

それらが利用可能かどうかを確認する簡単な方法は、次を実行することif($this->getRequest() instanceof \Magento\Framework\App\Request\Http) {です。その確認に合格すると、これらのパラメーターを使用できます。
Navarr 2016

5

getPostValue() で書かれています

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

それからgetPost値を取得します

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

あなたが少なくともいくつかのヒントを得ることを願っています。


そしてはい、あなたは使うことができます

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

post値を取得するには、Contactモジュールをチェックしてヒントを取得することもできます


1
「コードハント」をありがとう。しかし、それは私の質問ではありませんでした。私はすでにその定義を見つけました。そのため、「httpリクエストには常にそこにいるのですか?」と尋ねました。。私の質問は、「RequestInterfaceにない場合でも、これらのメソッドを使用しても安全ですか?」です。これはどこでも使用されています。
マリウス

1

コントローラでPostデータを取得するには、実行関数で以下を使用する必要があります。

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

0

我々は呼び出すことで、リクエストオブジェクトを取得する場合Magentoの2.1では、$this->getRequest()それが返されますMagento\Framework\App\Request延長ですMagento\Framework\HTTP\PhpEnvironment\Request。これが、メソッドgetPostValueを呼び出すことができる理由です。

getPostValueを呼び出すコントローラーの単体テストを作成しようとすると、問題が発生しました。getPostValueはRequestInterfaceで定義されていないため、RequestInterfaceのモックオブジェクトを直接作成する代わりに、のモックオブジェクトを作成しますMagento\Framework\App\Request\Http


-1

これらのメソッドが常にhttpリクエストのために存在すると想定しても問題ありませんか?

番号。

メソッドがインターフェースにない場合、将来のバージョンで変更されます。インターフェイスのメソッドをできるだけ使用する必要があります。APIコントラクトのため、メジャーバージョンのアップグレードを除いて、APIの既存のメソッドは変更されません。

$ _POSTデータを取得するには、モジュールで他の何かを使用する必要がありますか?

はい。

インターフェースMagento\Framework\App\RequestInterfaceでは、メソッドgetParams()はpostデータ配列をgetParam($key, $defaultValue = null)取得でき、メソッドはpost内の特定のデータを取得できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.