Làm cách nào để đặt, truy xuất và hủy đặt biến phiên trong Magento 2?


33

Tương đương với phiên trong Magento 1 là gì

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

Tương tự trong Magento 2?

Câu trả lời:


20

Tôi đã tìm thấy cách tương đương cho điều này trong Magento2:

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

Đặt / Nhận / Bỏ đặt giá trị trong phiên cốt lõi:

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

Bằng cách này, chúng tôi có thể đặt giá trị tùy chỉnh nếu giá trị phiên của chúng tôi không liên quan đến các phiên bên dưới:

  • \ Magento \ Backend \ Model \ Phiên
  • \ Magento \ Catalog \ Model \ Phiên
  • \ Magento \ Checkout \ Model \ Phiên
  • \ Magento \ Khách hàng \ Mô hình \ Phiên
  • \ Magento \ Bản tin \ Mô hình \ Phiên

1
Giải thích tốt đẹp!
Himmat Paliwal

@Sarfaraz, chúng tôi có thể đặt phiên trong bộ điều khiển và chúng tôi có thể truy cập trong tệp khối không?
jafar pinjar

chúng ta có thể đặt giá trị số nguyên không?, tôi đang gặp lỗi bên dưới, Đối tượng của lớp Magento \\ Framework \\ session \\ Generic \\ Interceptor không thể được chuyển đổi thành chuỗi
jafar pinjar

57

Trong magento 2 không còn nữa core/session.
Có những cái này mặc dù (cũng có thể là những cái khác):

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

Bạn cần tạo một phụ thuộc cho phiên bạn cần trong khối hoặc bộ điều khiển của bạn hoặc bất cứ điều gì.
Hãy lấy ví dụ \Magento\Catalog\Model\Session.

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

Sau đó, bạn có thể sử dụng phiên danh mục bên trong lớp như thế này:

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

[EDIT]
Bạn không nên sử dụng phiên trong mẫu.
Bạn nên tạo các hàm bao trong lớp khối mà các mẫu có thể sử dụng để đặt / nhận giá trị.

Sử dụng ví dụ trên, tạo các phương thức trong khối

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

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

Nhưng nếu bạn thực sự muốn sử dụng phiên trong mẫu, bạn chỉ có thể tạo trình bao bọc trong khối để nhận phiên:

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

Sau đó, bạn có thể làm điều này trong mẫu:

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

Làm thế nào để sử dụng phiên trong tập tin phtml?
Rakesh Jesadiya

@RakeshJesadiya. Xem cập nhật của tôi.
Marius

1
@Hóa đơn. Tôi không biết
Marius

1
@Marius Tôi nghĩ bạn đã quên đề cập đến cách bỏ đặt biến phiên. Vì vậy, xin vui lòng bình luận liên quan đến nó. Nó có giống Magento 1.9.xx hay không?
Bhupendra Jadeja

2
Vâng. Giống như trong 1.9. Sử dụngunsMyValue
Marius

7

Đây là tất cả các loại phiên trong 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

Theo tiêu chuẩn mã hóa Magento 2 ECGM2, trước tiên bạn sử dụng lớp phiên sau đó bạn có thể chuyển nó vào hàm tạo nếu không lỗi này sẽ được hiển thị

Đối tượng phiên PHẢI KHÔNG được yêu cầu trong hàm tạo. Nó chỉ có thể được thông qua như là một đối số phương thức.

Đây là cách bạn có thể thiết lập và nhận dữ liệu trong phiên

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

Để đặt giá trị

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

Để có được giá trị

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

Đối với giá trị phiên Unset

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

@RobbieAverill Nếu bạn tìm thấy bất kỳ giải pháp nào từ các trang web khác, bạn có thể chia sẻ ở đây trên StackOverflow không được gọi là sao chép quá khứ. nó được gọi là R & D. Bạn hiểu không?
Hoàng tử Patel

1
Điều đó tốt, nhưng bạn nên ghi nhận nguồn của mình khi làm như vậy
Robbie Averill

1
@RobbieAverill, Có bạn đúng. Cảm ơn vì đã góp ý. Tôi cập nhật câu trả lời của tôi.
Hoàng tử Patel

Tôi đang nhận được cảnh báo trong khi sử dụng một khách hàngSession "Đối tượng phiên KHÔNG được yêu cầu trong hàm tạo. Nó chỉ có thể được truyền dưới dạng đối số phương thức." Làm thế nào để giải quyết nó?
Sanjay Gohil

1
@SanjayGohil kiểm tra câu trả lời cập nhật của tôi. đầu tiên sử dụng lớp phiên và chuyển vào hàm tạo để tránh lỗi này "" Đối tượng phiên KHÔNG được yêu cầu trong hàm tạo. Nó chỉ có thể được thông qua như một đối số phương thức "
Hoàng tử Patel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.