3

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.

7

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;
    }
  • It's giving Fatal error Fatal error: Call to undefined method Magento\Customer\Model\SessionFactory::getCustomer() – Lead Developer Dec 27 '16 at 10:12
  • Updated code use it – Prashant Valanda Dec 27 '16 at 11:46
  • Don't use cacheable="false" in your XML as it will make the entire page not cacheable. (unless this is what you want) – jsims281 Apr 8 at 6:47
2

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');
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*/
        }
    }
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.