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-запросов?

Не думай так. Они нарушают свой собственный классовый контракт. Как вы можете себе представить, это совсем не ООП.

Согласно обычной рекомендации, я бы держался подальше от того, что не заявлено, Magento\Framework\App\RequestInterfaceпотому что а) вы порадуете Лискова и потому что б) они скоро поймут проблему и исправят ее (надеюсь), тем самым нарушив ваш код (или нет, но если они это сделают, они оправданы: вы не использовали контракт API, верно?).

Если они не исправят это, у них будет очень способная реализация API (то есть Magento\Framework\App\Request\Http), которую никто не будет реально использовать.

Всегда оставайтесь в рамках контракта!

nevvermind
источник
Это похоже на хороший подход в идеальном мире. К сожалению, я не нашел другого способа получить данные постов только методами RequestInterface. Но то, что вы говорите, звучит резонно. Я буду максимально избегать этих методов.
Мариус
Похоже, они знают. Только недавно: github.com/magento/magento2/issues/1675
nevvermind
Простой способ проверить, доступны ли они для вас, состоит в том, чтобы 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.

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.

Ключ Шан
источник