Como definir, recuperar e desinstalar variáveis ​​de sessão no Magento 2?


33

Qual é o equivalente para a sessão no Magento 1

Mage::getSingleton('core/session')->setMyValue('test');
Mage::getSingleton('core/session')->unsMyValue();

O mesmo no Magento 2?

Respostas:


20

Eu encontrei o caminho equivalente para isso no Magento2:

Mage::getSingleton('core/session')->setMyValue('test');
Mage::getSingleton('core/session')->unsMyValue();

Defina / obtenha / desative o valor na sessão principal:

protected $_coreSession;

public function __construct(
    -----
    \Magento\Framework\Session\SessionManagerInterface $coreSession
    ){
    $this->_coreSession = $coreSession;
    ----
}

public function setValue(){
    $this->_coreSession->start();
    $this->_coreSession->setMessage('The Core session');
}

public function getValue(){
    $this->_coreSession->start();
    return $this->_coreSession->getMessage();
}

public function unSetValue(){
    $this->_coreSession->start();
    return $this->_coreSession->unsMessage();
}

Dessa forma, podemos definir valores personalizados se o valor da sessão não estiver relacionado às sessões abaixo:

  • \ Magento \ Back-end \ Modelo \ Sessão
  • \ Magento \ Catálogo \ Modelo \ Sessão
  • \ Magento \ Caixa \ Modelo \ Sessão
  • \ Magento \ Cliente \ Modelo \ Sessão
  • \ Magento \ Newsletter \ Modelo \ Sessão

1
Boa explicação!
Himmat Paliwal

@ Sarfaraz, podemos definir a sessão no controlador e podemos acessar no arquivo de bloco?
jafar pinjar

podemos set valor inteiro ?, Eu estou ficando abaixo de erro, objeto da classe Magento \\ Framework \\ Sessão \\ genérico \\ Interceptor não pôde ser convertido para string
Jafar pinjar

57

No magento 2 não há mais core/session.
No entanto, existem estes (podem ser outros também):

  • \Magento\Backend\Model\Session
  • \Magento\Catalog\Model\Session
  • \Magento\Checkout\Model\Session
  • \Magento\Customer\Model\Session
  • \Magento\Newsletter\Model\Session

Você precisa criar uma dependência para a sessão que precisa em seu bloco ou controlador ou qualquer outra coisa.
Vamos pegar por exemplo \Magento\Catalog\Model\Session.

protected $catalogSession;
public function __construct(
    ....
    \Magento\Catalog\Model\Session $catalogSession, 
    ....
){
    ....
    $this->catalogSession = $catalogSession;
    ....
}

Então você pode usar a sessão de catálogo dentro da classe como esta:

$this->catalogSession->setMyValue('test');
$this->catalogSession->getMyValue();

[EDIT]
Você não deve usar sessões em modelos.
Você deve criar wrappers na classe de bloco que os modelos podem usar para definir / obter valores.

Usando o exemplo acima, crie os métodos no bloco

public function setSessionData($key, $value)
{
    return $this->catalogSession->setData($key, $value);
}

public function getSessionData($key, $remove = false)
{
    return $this->catalogSession->getData($key, $remove);
}

Mas se você realmente deseja usar a sessão no modelo, basta criar um wrapper no seu bloco para obter a sessão:

public function getCatalogSession()
{
    return $this->catalogSession;
}

Então você pode fazer isso no modelo:

$this->getCatalogSession()->setMyValue('test');
$this->getCatalogSession()->getMyValue();

como usar a sessão no arquivo phtml?
Rakesh Jesadiya

@RakeshJesadiya. Veja minha atualização.
Marius

1
@Conta. Eu não sei
Marius

1
@ Marius Acho que você esqueceu de mencionar como desabilitar a variável de sessão. Então, por favor, comente sobre isso. É semelhante ao Magento 1.9.xx ou então?
Bhupendra Jadeja

2
Sim. É como no 1.9. UseunsMyValue
Marius

7

Estes são todos os tipos de sessão no Magento 2

1)  \Magento\Catalog\Model\Session //vendor/magento/module-catalog/Model/Session.php

2) \Magento\Newsletter\Model\Session //vendor/magento/module-newsletter/Model/Session.php

3) \Magento\Persistent\Model\Session //vendor/magento/module-persistent/Model/Session.php

4) \Magento\Customer\Model\Session //vendor/magento/module-customer/Model/Session.php

5) \Magento\Backend\Model\Session //vendor/magento/module-backend/Model/Session.php

6) \Magento\Checkout\Model\Session //vendor/magento/module-checkout/Model/Session.php

De acordo com o padrão de codificação Magento 2 ECGM2, você primeiro usa a classe de sessão e pode passá-la ao construtor, caso contrário, este erro será mostrado

Objeto de sessão não deve ser solicitado no construtor. Só pode ser passado como argumento de método.

Aqui está como você pode definir e obter dados na sessão

namespace vendor\module\..;

use Magento\Catalog\Model\Session as CatalogSession;
use Magento\Customer\Model\Session as CustomerSession;
use Magento\Checkout\Model\Session as CheckoutSession;
use \Magento\Framework\Session\SessionManagerInterface as CoreSession

class ClassName {
    ...

    protected $_coreSession;
    protected $_catalogSession;
    protected $_customerSession;
    protected $_checkoutSession;

    public function __construct(
        ....
        CoreSession $coreSession,
        CatalogSession $catalogSession,
        CustomerSession $customerSession,
        CheckoutSession $checkoutSession,
        ....
    ){
        ....
        $this->_coreSession = $coreSession;
        $this->_catalogSession = $catalogSession;
        $this->_checkoutSession = $checkoutSession;
        $this->_customerSession = $customerSession;

        ....
    }

    public function getCoreSession() 
    {
        return $this->_coreSession;
    }

    public function getCatalogSession() 
    {
        return $this->_catalogSession;
    }

    public function getCustomerSession() 
    {
        return $this->_customerSession;
    }

    public function getCheckoutSession() 
    {
        return $this->_checkoutSession;
    }
}

Para definir o valor

$this->getCustomerSession()->setMyValue('YourValue');

Para obter valor

$this->getCustomerSession()->getMyValue();

Para valor de sessão não definido

$this->getCustomerSession()->unsMyValue();

@RobbieAverill Se você encontrou alguma solução de outros sites, pode compartilhar aqui no StackOverflow que não é chamado de copiar passado. chama-se P&D. Voce entende?
Prince Patel

1
Isso é bom, mas você deve atribuir suas fontes quando fazê-lo
Robbie Averill

1
@RobbieAverill, Sim, você está certo. Obrigado pela sugestão. Eu atualizei minha resposta.
Prince Patel

Estou recebendo um aviso enquanto uso uma customerSession "O objeto de sessão NÃO DEVE ser solicitado no construtor. Ele só pode ser passado como argumento de método". Como resolver isso?
Sanjay Gohil

1
@SanjayGohil verifique minha resposta atualizada. primeiro use a classe de sessão e passe para o construtor para evitar este erro "" O objeto de sessão NÃO DEVE ser solicitado no construtor. Isso só pode ser passado como argumento de método "
Prince Patel,
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.