Magento 2에서 세션 변수를 설정, 검색 및 설정 해제하는 방법


33

마 젠토 1의 세션에 해당하는 것은 무엇입니까 1

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

마 젠토 2에서도 마찬가지입니까?

답변:


20

Magento2에서 이와 동등한 방법을 찾았습니다.

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

핵심 세션에서 값 설정 / 가져 오기 / 설정 해제 :

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

이런 식으로 세션 값이 아래 세션과 관련이없는 경우 사용자 정의 값을 설정할 수 있습니다.

  • \ 마 젠토 \ 백엔드 \ 모델 \ 세션
  • \ 마 젠토 \ 카탈로그 \ 모델 \ 세션
  • \ 마 젠토 \ 체크 아웃 \ 모델 \ 세션
  • \ 마 젠토 \ 고객 \ 모델 \ 세션
  • \ 마 젠토 \ 뉴스 레터 \ 모델 \ 세션

1
좋은 설명입니다!
Himmat Paliwal

@Sarfaraz, 컨트롤러에서 세션을 설정할 수 있고 블록 파일로 액세스 할 수 있습니까?
jafar pinjar

정수 값을 설정할 수 있습니까?, 오류가 발생합니다. 클래스 Magento \\ Framework \\ Session \\ Generic \\ Interceptor의 개체를 문자열로 변환 할 수 없습니다.
jafar pinjar

57

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

phtml 파일에서 세션을 사용하는 방법?
Rakesh Jesadiya

@RakeshJesadiya. 내 업데이트를 참조하십시오.
Marius

1
@계산서. 모르겠다
Marius

1
@Marius 세션 변수를 설정 해제하는 방법을 언급하는 것을 잊었다 고 생각합니다. 따라서 그것에 대해 의견을 말하십시오. 비슷한 Magento 1.9.xx 또는 다른가요?
Bhupendra Jadeja

2
네. 1.9와 같습니다. 사용unsMyValue
마리우스

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

Magento 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 다른 사이트에서 해결책을 찾은 경우 CopyOver라고 불리는 StackOverflow에서 공유 할 수 있습니다. R & D라고합니다. 당신은 이해합니까?
Prince Patel

1
괜찮습니다.하지만 그렇게 할 때 출처를
밝히십시오

1
@RobbieAverill, 네 맞습니다. 제안 해 주셔서 감사합니다. 내 답변을 업데이트했습니다.
Prince Patel

customerSession을 사용하는 동안 경고가 표시됩니다. "세션 오브젝트는 생성자에서 요청해서는 안됩니다. 메소드 인수로만 전달 될 수 있습니다." 그것을 해결하는 방법?
Sanjay Gohil

1
@ SanjayGohil 업데이트 된 답변을 확인하십시오. 먼저 세션 클래스를 사용하고 생성자에 전달하여이 오류를 피하십시오. ""세션 오브젝트는 생성자에서 요청해서는 안됩니다. 메소드 인수로만 전달 될 수 있습니다. "
Patel Prince Pat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.