Magento2 jak zdobyćRequest

36

W Magento 2 jak odbierać tablicę żądań? $_POSTa $_GETtakże jak my w Magento 1:

Mage::app()->getRequest()->getPost()
zhartaunik
źródło
Czy możesz określić, w której klasie chcesz mieć dane POST i GET.
Oscprofessionals

Odpowiedzi:

73

Jeśli próbujesz tego z rozszerzonego kontrolera, Magento\Framework\App\Action\Actionmożesz uzyskać żądanie za pomocą $this->getRequest()->getPost().
Jeśli jesteś w klasie niestandardowej, musisz wstrzyknąć żądanie do konstruktora.

<?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.*
    }
}
Marius
źródło
co z $ _GET?
zhartaunik
3
Ta sama droga. Wystarczy użyć getParams zamiast getPost
Marius
Dzięki, to działa. Próbowałem w PHPstorm z xDebug i zajrzałem do okna Zegarki. Ale mam pustą tablicę.
zhartaunik
1
Moja klasa \Magento\Framework\App\Request\Httpnie ma metody getPost, jesteś tego pewien?
peedee
1
@ JeroenVermeulen-MageHost 2,5 roku temu nie było standardu MEQP2, kiedy to napisałem.
Marius
16

Cześć, możesz łatwo uzyskać to w modelach, blokach i kontrolerach, używając:

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

Lub dodaj Magento\Framework\App\RequestInterfacedo parametrów konstruktora we własnych klasach:

<?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();
    }
}
Amit Bera
źródło
Mój \Magento\Framework\App\RequestInterfacenie ma metody getPost(), jesteś tego pewien?
peedee
Próbowałeś kodu? Wywołanie $this->getRequest()->getPost();zwraca Zend\Stdlib\Parametersmi obiekt. Nawet w rdzeniu Magento używa wielu takich połączeń, z parametrem takim jak na przykład w Magento\Sales\Controller\Adminhtml\Order\AddCommentlinii 31 jest wywołanie:$data = $this->getRequest()->getPost('history');
Jacques
@AmitBera Potrzebuję pomocy. Czy istnieje sposób, aby wywołać Magento\Catalog\Model\Product\Option\ReadHandlerklasę wtyczek tylko w interfejsie API szczegółów produktu?
Kirti Nariya,
2

To powinno działać, po prostu przetestuj. Porównaj i zobacz, czego brakuje.

<?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();
    }
}
Daniel
źródło
2
W szablonie nie musimy ponownie deklarować zmiennej żądania. Mamy już:$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
źródło