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,这种情况仍然没有得到改善:-(
pededee '16

Answers:


4

可以确定这些方法始终会用于http请求吗?

不要这样 他们正在打破自己的集体合同。可以想象,这根本不是面向对象的。

按照通常的建议,我不会使用任何声明的内容,Magento\Framework\App\RequestInterface因为a)您会让Liskov满意,并且b)他们很快就会意识到问题并予以解决(希望如此),从而破坏了代码(或不会;但是如果这样做,就可以证明是合理的:您没有使用API​​合约,对吗?)。

如果他们解决它,他们将有一个非常有能力的API实现(即Magento\Framework\App\Request\Http),没人会真正使用。

始终遵守合同!


在理想世界中,这似乎是一种不错的方法。不幸的是,我发现没有其他方法只能使用的方法来获取帖子数据RequestInterface。但是您所说的听起来很合理。我将尽可能避免使用这些方法。
马吕斯

看来他们知道了。仅在最近:github.com/magento/magento2/issues/1675
nevvermind 2015年

检查这些参数是否可用的一种简单方法是if($this->getRequest() instanceof \Magento\Framework\App\Request\Http) {-如果该检查通过,则可以使用这些参数!
纳瓦尔

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数据,您需要在execute函数中使用following。

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

0

在Magento 2.1中,如果我们通过调用获得请求对象$this->getRequest(),它将返回Magento\Framework\App\Requestextend Magento\Framework\HTTP\PhpEnvironment\Request。这就是为什么可以调用方法getPostValue的原因。

当我尝试为调用getPostValue的控制器创建单元测试时遇到了问题。由于未在RequestInterface中定义getPostValue,因此,我们直接为RequestInterface创建模拟对象,而不是直接为RequestInterface创建模拟对象Magento\Framework\App\Request\Http


-1

可以确定这些方法始终会用于http请求吗?

没有。

如果该方法不在界面中,则它将在将来的版本中更改。我们应该尽可能地在接口中使用这些方法。由于与API签订合同,因此,除了主要版本升级外,API中的现有方法将不会更改。

我是否应该在模块中使用其他内容来获取$ _POST数据?

是。

在接口中Magento\Framework\App\RequestInterface,该方法getParams()可以获取发布数据数组,该方法getParam($key, $defaultValue = null)可以获取发布中的特定数据。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.