Como obter o ID de cliente logado

Sep 04 2020

Estou tentando obter o ID do cliente de um cliente conectado, mas não parece estar funcionando

no meu bloco

<?php
namespace Vendor\Module\Block;
use Magento\Framework\View\Element\Template;
use Magento\Backend\Block\Template\Context;

class Rfq extends \Magento\Framework\View\Element\Template
{    
    protected $_customerSession; public function __construct(Context $context,
        \Magento\Customer\Model\Session $customerSession, array $data = [])
    {
        parent::__construct($context, $data);
        $this->_customerSession = $customerSession;   
    }

            public function getCustomerId()
                    {
                         if($this->_customerSession->isLoggedIn()): return $this->_customerSession->getCustomer()->getId();                        
                         endif;
                    }

            public function execute()
            {

                $this->_view->loadLayout(); $this->_view->getLayout()->initMessages();
                $this->_view->renderLayout();
            }
        }

Agora em arquivo phtml

<?php
$customerId = $customer->getCustomerId();
?>

qualquer sugestão ou problema no código, obrigado

Controlador de atualização

<?php
namespace Vendor\Module\Controller\Index;
use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\View\Result\PageFactory;

class Customer extends \Magento\Framework\App\Action\Action
{
    protected $resultPageFactory;

    public function __construct(
        Context $context, PageFactory $resultPageFactory
    ) {
        $this->resultPageFactory = $resultPageFactory;
        parent::__construct($context); } public function execute() { return $this->resultPageFactory->create();
        $this->_view->loadLayout(); $this->_view->renderLayout(); 
    }


  
} 
 

Respostas

3 AmitBera Sep 08 2020 at 17:42

Se você não puder identificar o cliente em sua classe de bloco quando sua página atingir o cache de página inteira.

Você deve passar o ID do cliente como uma variável de contexto HTTP .

Vejo https://devdocs.magento.com/guides/v2.3/extension-dev-guide/cache/page-caching/public-content.html#configure-page-variations

Crie uma classe de plugin em Magento\Framework\App\Action\AbstractAction.

<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
 
    <type name="Magento\Framework\App\Action\AbstractAction">
        <plugin name="add_customr_id_full_page"  disabled="false" sortOrder="20"
                type="Devamitbera\Module\Plugin\Framework\App\Action"/>        
    </type>   

    </type>      
</config>

No plugin, passe o ID do cliente atual como variável de contexto http:

<?php

declare(strict_types=1);

namespace Devamitbera\Module\Plugin\Framework\App\Action;

use Magento\Customer\Model\Context as CustomerContext;
use Magento\Framework\Exception\NoSuchEntityException;

class AbstractAction
{

    /**
     * @var \Magento\Customer\Api\CustomerRepositoryInterface
     */
    private $customerRepository; /** * @var \Magento\Customer\Model\Session */ private $customerSession;

    /**
     * @var \Magento\Framework\App\Http\Context
     */
    private $httpContext; public function __construct( \Magento\Customer\Model\Session $customerSession,
        \Magento\Framework\App\Http\Context $httpContext, \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository
    ) {
        $this->customerSession = $customerSession;
        $this->httpContext = $httpContext;
        $this->customerRepository = $customerRepository;
    }
    

    public function aroundDispatch(
        \Magento\Framework\App\ActionInterface $subject, callable $proceed,
        \Magento\Framework\App\RequestInterface $request ) { $customerId = $this->customerSession->getCustomerId(); $this->httpContext->setValue(
            'current_cust_id',
            $customerId, 0 ); return $proceed($request);
    }
} 

Depois disso, Inject, \Magento\Framework\App\Http\Contextem sua classe de bloco e obtenha este valor de id de cliente por$this->httpContext->getValue('current_cust_id')

1 DhirenVasoya Sep 07 2020 at 13:23

Seu código de bloco precisa gostar deste:

public function getCustomerId()
{
     if($this->_customerSession->isLoggedIn()): return $this->_customerSession->getCustomer()->getId();                        
     endif;
}

E em phtml você precisa chamar assim:

<?php $customerId = $block->getCustomerId(); ?>
MohitPatel Sep 05 2020 at 19:01

Seu código é perfeito. Estou assumindo que sua chamada de arquivo de bloco em seu .xmlarquivo e em arquivo de chamada de arquivo xml. .phtmlE você executa abaixo todos os comandos como: -

remove your var/cache
remove your var/view_preprocessed
php bin/magento setup:di:compile
php bin/magento s:up
php bin/magento s:s:d -f
php bin/magento c:c
php bin/magento c:f

Depois de verificar sua saída. E novamente não mostrar sua saída, verifique o erro de log compartilhar comigo.

THANKS.

RiteshSantra Sep 05 2020 at 21:46

No arquivo de bloco, você precisa alterar o código conforme abaixo

De:

<?php
$customerId = $customer->getCustomerId();
?>

Para:

<?php
$customerId = $block->getCustomerId();
?>
WaqarAli Sep 07 2020 at 17:19

Se o cliente estiver conectado, você não pode obter Da sessão Tente desta forma

public function __construct(
    \Magento\Framework\App\Http\Context $customerContext, \Magento\Customer\Model\SessionFactory $customer
{
    $this->customer = $customer;
    $this->customerContext = $customerContext;
}

public function getCustomerID()
{
    $customerLoggedIn= $this->customerContext->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH);
    if($customerLoggedIn){ $customerId = $this->customer->create()->getCustomer()->getId(); return $customerId;
    }
}
Msquare Sep 07 2020 at 16:45

Use isso em seu arquivo de layout onde você adiciona seu bloco.

cacheable = "false"

        <block class="VendoreName\ModuleName\Block\BlockName"
               name="block_index_edit"
               template="VendoreName_ModuleName::edit.phtml"
               cacheable="false" />

Atualizar

Seu arquivo de controlador

<?php
namespace Vendor\Module\Controller\Index;
use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\View\Result\PageFactory;

class Customer extends \Magento\Framework\App\Action\Action
{
    protected $resultPageFactory; public function __construct( Context $context,
        PageFactory $resultPageFactory ) { $this->resultPageFactory = $resultPageFactory; parent::__construct($context);
    }
    public function execute()
    {
        return $this->resultPageFactory->create(); $this->_view->loadLayout(); 
        $this->_view->renderLayout(); 
    }
} 

Seu arquivo de bloco

<?php

namespace VendoreName\ModuleName\Block;

use Magento\Framework\View\Element\Template;

class Rfq extends Template
{
    protected $request;
    protected $sessionFactory; public function __construct( Template\Context $context,
        \Magento\Framework\App\Request\Http $request, \Magento\Customer\Model\SessionFactory $sessionFactory,
        array $data = [] ) { parent::__construct($context, $data); $this->sessionFactory = $sessionFactory; $this->request = $request; } public function getCustomerId() { // get customer id here $customerSession = $this->sessionFactory->create(); return $customerSession->getCustomer()->getId();
    }

}

Seu arquivo phtml

<?php
$customerId = $block->getCustomerId();
echo "Customer ID is ".$customerId;
?>

Espero que isso ajude você.