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。而我正在块类中做到这一点。
保罗,

您使用哪个会话类?
索赫拉纳

我刚刚发现$this->session->isLoggedIn()在控制器类中返回true,但在块类中返回false。为什么?
保罗,

4
必须设置块,cacheable=false请参阅Magento 2-从块类的会话中获取客户ID
Lukas Komarek

Answers:


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()总是假的。我在控制器类中也做同样的事情,并且效果很好。
保罗

最后,它可以工作。我不确定自己做了什么更改。
保罗

您是否禁用了全页缓存?
davideghz

是的,它是缓存,我也遇到过同样的问题<block class="Vendor\Block\Bla\Bla" name="block.name" template="Wed2b_Suppliers::template/template.phtml" cacheable="false"/>
朱利诺·瓦尔加斯

我禁用了缓存,但缓存仍返回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
遗漏

@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时会重置所有客户会话。

请在布局中使用cacheable =“ false”代替block:

<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”?
贾法尔·品哈尔19'Mar

0

如果只需要customer_idthen而不加载整个对象(请参见method getCustomer方法),则只需使用getCustomerIdmethod 即可获取它。

作为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
    }
?>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.