วิธีการตั้งค่าดึงและเลิกตั้งค่าตัวแปรเซสชันใน Magento 2


33

อะไรคือสิ่งที่เทียบเท่ากับเซสชันใน Magento 1

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

เหมือนกันใน Magento 2

คำตอบ:


20

ฉันพบวิธีที่เท่าเทียมกันสำหรับเรื่องนี้ใน Magento2:

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

Set / Get / Unset Value ใน Core Session:

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

ด้วยวิธีนี้เราสามารถตั้งค่าที่กำหนดเองถ้าค่าเซสชันของเราไม่เกี่ยวข้องกับเซสชันด้านล่าง:

  • \ วีโอไอพี \ Backend \ รุ่น \ เซสชัน
  • \ วีโอไอพี \ แคตตาล็อก \ รุ่น \ เซสชัน
  • \ วีโอไอพี \ ร้า \ รุ่น \ เซสชัน
  • \ วีโอไอพี \ ลูกค้า \ รุ่น \ เซสชัน
  • \ วีโอไอพี \ จดหมายข่าว \ รุ่น \ เซสชัน

1
คำอธิบายที่ดี!
Himmat Paliwal

@Sarfaraz เราสามารถตั้งค่าเซสชันในคอนโทรลเลอร์และเราสามารถเข้าถึงไฟล์บล็อกได้
jafar pinjar

เราสามารถตั้งค่าจำนวนเต็มได้หรือไม่ฉันได้รับข้อผิดพลาดด้านล่างวัตถุของคลาส Magento \\ Framework \\ Session \\ Generic \\ Interceptor ไม่สามารถแปลงเป็นสตริงได้
jafar pinjar

57

ในวีโอไอพี 2 ไม่มีอีกcore/sessionแล้ว
มีคนเหล่านี้แม้ว่า (อาจเป็นคนอื่นด้วย):

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

คุณต้องสร้างการพึ่งพาสำหรับเซสชันที่คุณต้องการในบล็อกหรือตัวควบคุมหรืออะไรก็ตาม ลองยกตัวอย่างเช่น
\Magento\Catalog\Model\Session

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

จากนั้นคุณสามารถใช้เซสชันแคตตาล็อกภายในชั้นเรียนเช่นนี้:

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

[แก้ไข]
คุณไม่ควรใช้เซสชันในแม่แบบ
คุณควรสร้างชุดในคลาสบล็อกที่แม่แบบสามารถใช้เพื่อตั้ง / รับค่า

ใช้ตัวอย่างด้านบนสร้างวิธีในบล็อก

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

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

แต่ถ้าคุณต้องการใช้เซสชันในเทมเพลตจริงๆคุณสามารถสร้างเสื้อคลุมในบล็อกของคุณเพื่อรับเซสชัน:

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

จากนั้นคุณสามารถทำได้ในเทมเพลต:

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

วิธีการใช้งานเซสชั่นในไฟล์ HTML?
Rakesh Jesadiya

@RakeshJesadiya ดูการปรับปรุงของฉัน
Marius

1
@บิล. ฉันไม่รู้
Marius

1
@Marius ฉันคิดว่าคุณลืมที่จะพูดถึงวิธีการตั้งค่าตัวแปรเซสชั่น ดังนั้นโปรดแสดงความคิดเห็นเกี่ยวกับมัน มันคล้ายกับวีโอไอพี 1.9.xx หรืออื่น ๆ ?
Bhupendra Jadeja

2
อ๋อ มันเหมือนใน 1.9 ใช้unsMyValue
Marius

7

นี่คือประเภทเซสชันทั้งหมดใน 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

ตามมาตรฐานการเข้ารหัสวีโอไอพี 2 ECGM2 คุณใช้คลาสเซสชั่นครั้งแรกจากนั้นคุณสามารถส่งมันไปยังตัวสร้างมิฉะนั้นข้อผิดพลาดนี้จะปรากฏขึ้น

วัตถุเซสชั่นจะต้องไม่ถูกร้องขอในตัวสร้าง มันสามารถถูกส่งผ่านเป็นอาร์กิวเมนต์วิธี

นี่คือวิธีที่คุณสามารถตั้งค่าและรับข้อมูลในเซสชัน

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

เพื่อกำหนดค่า

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

เพื่อให้ได้ค่า

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

สำหรับล้างค่าเซสชั่น

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

@RobbieAverill หากคุณพบวิธีการแก้ปัญหาใด ๆ จากเว็บไซต์อื่น ๆ ที่คุณสามารถแบ่งปันที่นี่ใน StackOverflow ที่ไม่ได้เรียกว่าคัดลอกที่ผ่านมา มันเรียกว่า R & D คุณเข้าใจไหม?
เจ้าชาย Patel

1
ไม่เป็นไร แต่คุณควรระบุแหล่งที่มาของคุณเมื่อทำเช่นนั้น
Robbie Averill

1
@ RobbieAverill ใช่คุณพูดถูก ขอบคุณสำหรับคำแนะนำ ฉันปรับปรุงคำตอบของฉัน
เจ้าชาย Patel

ฉันได้รับคำเตือนในขณะที่ใช้ customerSession "ไม่ต้องมีการขอวัตถุเซสชันในตัวสร้างมันสามารถส่งผ่านได้เป็นอาร์กิวเมนต์วิธีเท่านั้น" วิธีแก้ปัญหา
Sanjay Gohil

1
@SanjayGohil ตรวจสอบคำตอบที่อัปเดตของฉัน ก่อนอื่นให้ใช้คลาสเซสชันและส่งผ่านไปยังตัวสร้างเพื่อหลีกเลี่ยงข้อผิดพลาดนี้ "" วัตถุเซสชันต้องไม่ถูกร้องขอในตัวสร้าง มันสามารถถูกส่งผ่านเป็นอาร์กิวเมนต์วิธี "
เจ้าชาย Patel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.