Я вижу, что везде, где запрос задействован в Magento 2, запрос является реализацией \Magento\Framework\App\RequestInterface
.
Этот интерфейс не содержит методы getPost
(используемые в \Magento\Catalog\Controller\Adminhtml\Category\Widget\CategoriesJson
) и getPostValue
(используемые в \Magento\Catalog\Controller\Adminhtml\Product\Save
), но они все еще вызываются.
Можно ли предположить, что эти методы всегда будут доступны для http-запросов?
или я должен использовать что-то еще в моих модулях для получения $_POST
данных?
magento2
http-request
Мариус
источник
источник
Ответы:
Не думай так. Они нарушают свой собственный классовый контракт. Как вы можете себе представить, это совсем не ООП.
Согласно обычной рекомендации, я бы держался подальше от того, что не заявлено,
Magento\Framework\App\RequestInterface
потому что а) вы порадуете Лискова и потому что б) они скоро поймут проблему и исправят ее (надеюсь), тем самым нарушив ваш код (или нет, но если они это сделают, они оправданы: вы не использовали контракт API, верно?).Если они не исправят это, у них будет очень способная реализация API (то есть
Magento\Framework\App\Request\Http
), которую никто не будет реально использовать.Всегда оставайтесь в рамках контракта!
источник
RequestInterface
. Но то, что вы говорите, звучит резонно. Я буду максимально избегать этих методов.if($this->getRequest() instanceof \Magento\Framework\App\Request\Http) {
- если эта проверка прошла, вы можете использовать эти параметры!getPostValue()
написано вlib\internal\Magento\Framework\HTTP\PhpEnvironment\Request.php
тогда получим
getPost
значение отvendor\zendframework\zend-http\src\Request.php
Надеюсь, вы получите хотя бы намек.
И да, вы можете использовать
Чтобы получить
post
значение, вы также можете проверитьContact
модуль, чтобы получить подсказкуисточник
Чтобы получить данные Post в контроллере, вам нужно использовать следующее в вашей функции execute.
источник
В Magento 2.1, если мы получим объект запроса путем вызова
$this->getRequest()
, он вернётMagento\Framework\App\Request
расширениеMagento\Framework\HTTP\PhpEnvironment\Request
. Вот почему метод getPostValue может быть вызван.У меня проблема, когда я пытаюсь создать модульный тест для моего контроллера, который вызывает getPostValue. Поскольку getPostValue не определен в RequestInterface, вместо того, чтобы создавать фиктивный объект для RequestInterface напрямую, мы создаем фиктивный объект для
Magento\Framework\App\Request\Http
.источник
Нет.
Метод будет изменен в будущей версии, если его нет в интерфейсе. Мы должны максимально использовать методы интерфейса. Из-за контракта API существующие методы в API не будут изменены, за исключением основных обновлений версии.
Да.
В интерфейсе
Magento\Framework\App\RequestInterface
методgetParams()
может получить массив данных post, методgetParam($key, $defaultValue = null)
может получить конкретные данные post.источник