Magento2 как получить запрос

36

В Magento 2 как получить массив запросов? $_POSTи так $_GETже, как мы сделали в Magento 1:

Mage::app()->getRequest()->getPost()
zhartaunik
источник
Можете ли вы указать, в каком классе вы хотите POST и GET данные.
Oscprofessionals

Ответы:

73

Если вы пытаетесь это сделать из контроллера, который расширяет, Magento\Framework\App\Action\Actionвы можете получить запрос с помощью $this->getRequest()->getPost().
Если вы находитесь в пользовательском классе, вам нужно вставить запрос в конструктор.

<?php
namespace Namespace\Module\Something;
class ClassName 
{
    protected $request;
    public function __construct(
       \Magento\Framework\App\RequestInterface $request
        ....//rest of parameters here
    ) {
       $this->request = $request;
       ...//rest of constructor here
    }
    public function getPost()
    {
        return $this->request->getPostValue();//in Magento 2.*
    }
}
Мариус
источник
как насчет $ _GET?
Жартауник
3
Так же. Просто используйте getParams вместо getPost
Мариус
Спасибо, это работает. Я попробовал в PHPstorm с xDebug и заглянуть в окно Watches. Но я получил пустой массив.
Жартауник
1
У моего класса \Magento\Framework\App\Request\Httpнет метода getPost, вы уверены в этом?
Пиди
1
@ JeroenVermeulen-MageHost, когда я писал это, не было стандарта MEQP2 2,5 года назад.
Мариус
16

Привет, вы можете легко получить его в моделях, блоках и контроллерах, используя:

$this->getRequest()->getPost() 

Или добавьте Magento\Framework\App\RequestInterfaceв конструктор параметры в ваших собственных классах:

<?php
namespace MyModuleNameSpace\MyModule\Block
use Magento\Framework\App\RequestInterface;

class MyClass
{
    /**
     * Request instance
     *
     * @var \Magento\Framework\App\RequestInterface
     */
    protected $request;

    /**
     * @param RequestInterface $request
     */
    public function __construct(RequestInterface $request)
    {
        $this->request = $request;
    }

    public function getMyPostParams()
    {
        $postData = $this->request->getPost();
    }
}
Амит Бера
источник
У меня \Magento\Framework\App\RequestInterfaceнет метода getPost(), вы уверены в этом?
Пиди
Вы пробовали код? Вызов $this->getRequest()->getPost();возвращает Zend\Stdlib\Parametersобъект для меня. Даже в ядре Magento использует множество вызовов, подобных этому, с таким параметром, как, например, в Magento\Sales\Controller\Adminhtml\Order\AddCommentстроке 31 есть вызов:$data = $this->getRequest()->getPost('history');
Жак
@AmitBera Мне нужна помощь, есть ли способ вызвать Magento\Catalog\Model\Product\Option\ReadHandlerкласс плагина только для получения API данных продукта?
Кирти Нария
2

Это должно работать, просто проверьте это. Сравните и посмотрите, чего не хватает.

<?php
namespace MyModuleNameSpace\MyModule\Block
use Magento\Framework\App\RequestInterface;

class MyClass extends \Magento\Framework\View\Element\Template
{
    /**
     * Request instance
     *
     * @var \Magento\Framework\App\RequestInterface
     */
    protected $request;

    /**
     * @param RequestInterface $request
     */
    public function __construct(
        RequestInterface $request,
        \Magento\Framework\View\Element\Template\Context $context,
        array $data = [])
    {
        $this->request = $request;
        parent::__construct($context, $data);
    }

    public function getMyPostParams()
    {
        $postData = $this->request->getPost();
    }
}
Даниил
источник
2
В шаблоне нам не нужно повторно объявлять переменную запроса. Мы уже:$this->_request
Khoa TruongDinh
1
private $params = ['id', 'name'];

public function execute()
{
    $this->getPostParams();
}

private function getPostParams()
{
    foreach ($this->params as $k) 
    {
        $this->params[$k] = $this->getRequest->getParam($k);
    }
}
Ydrus
источник