Bagaimana cara mengatur, mengambil dan menghapus variabel sesi di Magento 2?

33

Apa yang setara untuk sesi di Magento 1

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

Sama di Magento 2?

Rakesh Jesadiya
sumber

Jawaban:

20

Saya menemukan cara yang setara untuk ini di Magento2:

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

Tetapkan / Dapatkan / Hapus Nilai dalam Sesi Inti:

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();
}

Dengan cara ini kami dapat menetapkan nilai khusus jika nilai sesi kami tidak terkait dengan sesi di bawah ini:

  • \ Magento \ Backend \ Model \ Session
  • \ Magento \ Katalog \ Model \ Sesi
  • \ Magento \ Checkout \ Model \ Session
  • \ Magento \ Pelanggan \ Model \ Sesi
  • \ Magento \ Newsletter \ Model \ Session
Sarfaraz bheda
sumber
1
Penjelasan yang bagus!
Himmat Paliwal
@Sarfaraz, bisakah kita mengatur sesi di controller dan kita dapat mengakses dalam file blok?
jafar pinjar
dapatkah kita menetapkan nilai integer ?, saya mendapatkan error di bawah ini, Obyek kelas Magento \\ Framework \\ Session \\ Generic \\ Interceptor tidak dapat dikonversi ke string
jafar pinjar
57

Di Magento 2 tidak ada lagi core/session.
Ada yang ini (mungkin orang lain juga):

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

Anda perlu membuat ketergantungan untuk sesi yang Anda butuhkan di blok atau pengontrol Anda atau apa pun.
Mari kita ambil contoh \Magento\Catalog\Model\Session.

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

Kemudian Anda dapat menggunakan sesi katalog di dalam kelas seperti ini:

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

[EDIT]
Anda sebaiknya tidak menggunakan sesi di templat.
Anda harus membuat pembungkus di kelas blok yang dapat digunakan templat untuk menetapkan / mendapatkan nilai.

Dengan menggunakan contoh di atas, buat metode di blok

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

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

Tetapi jika Anda benar-benar ingin menggunakan sesi dalam template Anda bisa membuat pembungkus di blok Anda untuk mendapatkan sesi:

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

Kemudian Anda dapat melakukan ini di templat:

$this->getCatalogSession()->setMyValue('test');
$this->getCatalogSession()->getMyValue();
Marius
sumber
bagaimana cara menggunakan sesi dalam file phtml?
Rakesh Jesadiya
@RakeshJesadiya. Lihat pembaruan saya.
Marius
1
@Tagihan. Saya tidak tahu
Marius
1
@Marius Saya pikir Anda lupa menyebutkan cara menghapus variabel sesi. Jadi tolong beri komentar tentang itu. Apakah mirip dengan Magento 1.9.xx atau yang lain?
Bhupendra Jadeja
2
Ya. Seperti di 1.9. GunakanunsMyValue
Marius
7

Ini semua adalah tipe sesi di 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

Sesuai standar pengkodean Magento 2 ECGM2 Anda pertama kali menggunakan kelas sesi maka Anda dapat meneruskannya ke konstruktor jika tidak, kesalahan ini akan ditampilkan

Objek sesi TIDAK HARUS diminta dalam konstruktor. Itu hanya bisa diteruskan sebagai argumen metode.

Inilah cara Anda dapat mengatur dan mendapatkan data dalam sesi

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;
    }
}

Untuk menetapkan nilai

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

Untuk mendapatkan nilai

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

Untuk Hapus nilai sesi

$this->getCustomerSession()->unsMyValue();
Pangeran Patel
sumber
@RobbieAverill Jika Anda menemukan solusi dari situs lain, Anda dapat membagikannya di StackOverflow yang tidak disebut copy past. ini disebut R&D. Apakah kamu mengerti?
Pangeran Patel
1
Tidak apa-apa, tetapi Anda harus mengaitkan sumber Anda saat melakukannya
Robbie Averill
1
@RobbieAverill, Ya Anda benar. Terima kasih atas sarannya. Saya memperbarui jawaban saya.
Pangeran Patel
Saya mendapatkan peringatan saat menggunakan customerSession "Objek sesi TIDAK HARUS diminta dalam konstruktor. Itu hanya dapat diteruskan sebagai argumen metode." Bagaimana cara mengatasinya?
Sanjay Gohil
1
@SanjayGohil periksa jawaban saya yang diperbarui. pertama kali menggunakan kelas sesi dan meneruskan ke konstruktor untuk menghindari kesalahan ini "" Sesi objek TIDAK HARUS diminta dalam konstruktor. Ini hanya dapat diteruskan sebagai argumen metode "
Pangeran Patel