7

This is my code,

   $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
   $customerSession = $objectManager->create('Magento\Customer\Model\Session');

   if ($customerSession->isLoggedIn()) {
        $customerSession->getCustomerId();  // get Customer Id
        $customerSession->getCustomerGroupId();
        $customerSession->getCustomer();
        $customerSession->getCustomerData();
        $myemail=(string)$customerSession->getCustomer()->getEmail();
        echo $myemail;

same code I run Custom module its getting customer email , but, I paste same code other magento core module, Now if condition failed if($customerSession->isLoggedIn()) why? how to solve this problem.

Prashant Valanda
  • 12,659
  • 5
  • 42
  • 69
Rajkumar .E
  • 3,570
  • 7
  • 38
  • 73

6 Answers6

19

I am facing same problem when Cache enable I am not able to get customer session.But I find below solution

    /**
     * @var \Magento\Customer\Model\Session
     */
    protected $_customerSession;

    public function __construct(Template\Context $context,
            \Magento\Framework\App\Request\Http $request,
            \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository,
            \Magento\Customer\Model\SessionFactory $customerSession
        ) 
    {
        $this->request = $request;
        $this->customerRepository = $customerRepository;
        $this->_customerSession = $customerSession;
        parent::__construct($context);
    }

    public function getCustomerId(){
        $customer = $this->_customerSession->create();
        var_dump($customer->getCustomer()->getId());
    }

Use above code in block It is working even cache is enable.

Second Solution:

Add cacheable="false" in your xml

<referenceContainer name="content">
     <block class="Vendor\Modulename\Block\Customer" name="customer.session.data" template="Vendor_Modulename::customertab.phtml" cacheable="false" />
 </referenceContainer>

Add below code in block:

    /**
     * @var \Magento\Customer\Model\Session
     */
    protected $_customerSession;

    /**
     * Construct
     *
     * @param \Magento\Framework\View\Element\Template\Context $context
     */
    public function __construct(Template\Context $context,
            \Magento\Framework\App\Request\Http $request,
            \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository,
            \Magento\Customer\Model\Session $customerSession
        ) 
    {
        $this->request = $request;
        $this->customerRepository = $customerRepository;
        $this->_customerSession = $customerSession;
        parent::__construct($context);
    }

    public function getOrderData(){
        $customerId = $this->_customerSession->getCustomerId();
        return $customerId;
    }
Prashant Valanda
  • 12,659
  • 5
  • 42
  • 69
3

That is not the correct way to do it. Using create you are going to instantiate a new object instead of getting the actual session.

It is the same difference as using getModel instead of getSingleton in Magento 1.

Option 1 (the correct option in Magento2):

Use __construct injection to get Magento\Customer\Model\Session:

protected $customerSession;
...
public function __construct(
  \Magento\Customer\Model\Session $customerSession
) {
   $this->customerSession = $customerSession;
}
...
public function yourMethod()
{
  if ($this->customerSession->isLoggedIn()) {
  ...
  }
}
...

Option 2 (working, but not suggested):

Use get instead of create:

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$customerSession = $objectManager->get('Magento\Customer\Model\Session');
Phoenix128_RiccardoT
  • 7,065
  • 2
  • 22
  • 36
1

use customer helper instead

Magento\Customer\Helper\Session\CurrentCustomer

to get logged in flag, you can approach with getCustomerId

Ansyori
  • 842
  • 10
  • 18
0

You can try by creating an object of objectManager and should not use objectManager directly.

Use something like,

class Example extends \Magento\Framework\View\Element\Template
{
    private $_objectManager;
    public function __construct(
        \Magento\Framework\ObjectManagerInterface $objectmanager
    ){
        $this->_objectManager = $objectmanager;
    }

    public function getExample()
    {
        $customerSession = $this->_objectManager->create("Magento\Customer\Model\Session");
        if ($customerSession->isLoggedIn()) {
            $customerData = $customerSession->getCustomer()->getData();
            /*Your logic*/
        }
    }
}
Kazim Noorani
  • 2,981
  • 3
  • 20
  • 42
0

This is a solution.

<?php
    $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
    $customerSession = $objectManager->get('Magento\Customer\Block\Account\Customer');
?>
<?php if($customerSession->customerLoggedIn()): ?>
    <span data-bind="scope: 'customer'"><span data-bind="text: customer().firstname"></span></span>
    <script type="text/x-magento-init">
      {
        "*": {
            "Magento_Ui/js/core/app": {
                "components": {
                    "customer": {
                        "component": "Magento_Customer/js/view/customer"
                    }
                }
            }
        }
      }
    </script>
<?php endif; ?>
Padhiyar Gaurang
  • 776
  • 6
  • 19
0

Thanks very much!This can solve my question!

get('Magento\Customer\Block\Account\Customer'); ?> customerLoggedIn()): ?>
<span data-bind="scope: 'customer'"><span data-bind="text: customer().firstname"></span></span>
<script type="text/x-magento-init">
  {
    "*": {
        "Magento_Ui/js/core/app": {
            "components": {
                "customer": {
                    "component": "Magento_Customer/js/view/customer"
                }
            }
        }
    }
  }
</script>
wei yu
  • 1