Magento 2 블록 클래스의 세션에서 고객 ID 가져 오기


12

세션에서 고객 ID를 얻는 방법은 무엇입니까? 나는 이것을 시도했지만 작동하지 않았다.

protected $_customerBonusPointFactory;
protected $_customerSession;

public function __construct(Session $customerSession, \Magento\Framework\View\Element\Template\Context $context) {
    $this->_customerSession = $customerSession;
    parent::__construct($context);
}

public function _prepareLayout() {
    var_dump($this->_customerSession->getCustomer()->getId());
    exit();
    return parent::_prepareLayout();
}

2
고객이 로그인하면 고객 ID를 얻을 수 있습니다. 그렇지 않으면 '$ this-> _ customerSession-> getCustomer ()-> getId ()'를 사용하여 null을 반환합니다.
Sohel Rana

로그인했지만 null을 반환합니다. 그리고 저는 블록 클래스에서하고 있습니다.
Paul

어떤 세션 수업을 사용하십니까?
Sohel Rana

방금 $this->session->isLoggedIn()컨트롤러 클래스에서는 true 를 반환하지만 블록 클래스에서는 false를 반환합니다. 왜?
Paul

답변:


25

작업중인 사본입니다. 블록 클래스와 비교할 수 있습니다. 여기서는 Form 을 블록 클래스로 사용합니다.

namespace Vendor\Module\Block;


class Form extends \Magento\Framework\View\Element\Template
{
    protected $customerSession;

    /**
     * Construct
     *
     * @param \Magento\Framework\View\Element\Template\Context $context
     * @param \Magento\Customer\Model\Session $customerSession
     * @param array $data
     */
    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Magento\Customer\Model\Session $customerSession,
        array $data = []
    ) {
        parent::__construct($context, $data);

        $this->customerSession = $customerSession;
    }

    public function _prepareLayout()
    {

        var_dump($this->customerSession->getCustomer()->getId());
        exit();
        return parent::_prepareLayout();
    }
}

1
정확히 똑같이했지만 여전히 null을 반환합니다. 그리고 $this->customerSession->isLoggedIn()항상 거짓입니다. 컨트롤러 클래스에서도 동일하게 작동하며 정상적으로 작동합니다.
Paul

마지막으로 작동합니다. 변경 한 내용이 확실하지 않습니다.
Paul

아마도 전체 페이지 캐시를 비활성화 했습니까?
davideghz

예, 그것은 같은 문제를 겪었던 캐시였습니다<block class="Vendor\Block\Bla\Bla" name="block.name" template="Wed2b_Suppliers::template/template.phtml" cacheable="false"/>
Juliano Vargas

캐시가 여전히 null을 반환하지 않도록 설정
Ajwad Syed

4

\Magento\Customer\Model\Session $customerSession,고객 세션에서 고객 ID를 얻으려면 클래스 를 주입해야합니다 .

protected $_customerSession;

public function __construct(
    ...
    \Magento\Customer\Model\Session $customerSession,
    ...
) {
    ...
    $this->_customerSession = $customerSession;
    ...
}

public function getCustomer()
{
    echo $this->_customerSession->getCustomer()->getId(); //Print current customer ID

    $customerData = $this->_customerSession->getCustomer(); 
    print_r($customerData->getData()); //Print current Customer Data
}

참고 : 고객이 로그인하고 고객 세션을 초기화 한 경우에만 고객 ID를 얻습니다.


4

세션을 사용할 블록을 정의 할 때 캐시를 비활성화해야합니다.

 <block class="Vendor\Module\Block\Index" name="Name"
 template="Vendor_Module::template/path.phtml" cacheable="false">
 </block>

2
이로 인해 전체 페이지와이 블록을 사용하는 모든 페이지가 FPC에 의해 누락됩니다
Doni Wibowo

@DoniWibowo는 사실이지만 동적 데이터가있는 페이지를 처음 캐싱 할 때는주의해야합니다. 예를 들어 모든 고객에 대해 동일한 이름을 표시하고 싶지는 않습니다.
Radu

1

고객 세션을 인스턴스화하기 전에 Context 객체를 부모 클래스에 전달하면 작동하는 것 같습니다.

class History extends \Magento\Framework\View\Element\Template
{

    /**
     * @var Session
     */
    protected $_session;

    public function __construct(
        Template\Context $context,
        \Magento\Customer\Model\Session $session,
        array $data
    )
    {
        parent::__construct($context, $data);
        $this->_session = $session;
    }

    public function _prepareLayout()
    {

        var_dump($this->_session->getCustomerId());
        exit();
        return parent::_prepareLayout();
    }
}

2
이상한. 나는 똑같은 것을 관찰한다. 도움을 주셔서 감사합니다. 이것이 왜 차이가 나는지 궁금합니다.
nshiff

0

로그인 한 고객 데이터를 검색하기 위해 고객 세션을 블록에 주입하는 동안 Magento 2는 FPC가 활성화 된 경우 모든 고객 세션을 재설정하기 때문에 고객 데이터를 블록에서 가져 오지 않습니다.

레이아웃에서 bloick을 위해 cacheable = "false"를 사용하십시오.

<referenceContainer name="content"> 
        <block class="Arman\Test\Block\List" name="list" template="Arman_Test::list.phtml" cacheable="false"> 
        </block>
    </referenceContainer>  

이 경우 Magento 2는이 페이지의 캐싱을 무시합니다.


cms 페이지에서 cacheable = "false"를 사용하는 방법은 무엇입니까?
jafar pinjar

0

customer_id전체 객체를로드하지 않고 then 메소드 만 필요한 경우 (메소드 getCustomer메소드 참조 ) 단순히 getCustomerId메소드 를 사용하여 얻을 수 있습니다 .

으로 getId방법도 호출 getCustomerId방법.

파일 : vendor / magento / module-customer / Model / Session.php

/**
 * Retrieve customer model object
 *
 * @return Customer
 * use getCustomerId() instead
 */
public function getCustomer()
{
    if ($this->_customerModel === null) {
        $this->_customerModel = $this->_customerFactory->create()->load($this->getCustomerId());
    }

    return $this->_customerModel;
}


/**
 * Retrieve customer id from current session
 *
 * @api
 * @return int|null
 */
public function getCustomerId()
{
    if ($this->storage->getData('customer_id')) {
        return $this->storage->getData('customer_id');
    }
    return null;
}

/**
 * Retrieve customer id from current session
 *
 * @return int|null
 */
public function getId()
{
    return $this->getCustomerId();
}

0

먼저 아래와 같이 header.phtml 파일에 인스턴스를 만들고 둘 이상의 상점을 사용할 수 있고 상점 중 하나에서만 메일을 받으려는 경우.

여기에 이미지 설명을 입력하십시오

<?php
    $objectManager =  \Magento\Framework\App\ObjectManager::getInstance();        
    $storeManager  = $objectManager->get('\Magento\Store\Model\StoreManagerInterface');
    $storeID       = $storeManager->getStore()->getStoreId(); 
    $storeName     = $storeManager->getStore()->getName();
?>

<?php
    $customerSession = $om->get('Magento\Customer\Model\Session');
    if($customerSession->isLoggedIn()) {
            echo $customerSession->getCustomer()->getId(); // get ID
    }
?>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.