Como verificar se o cliente está logado ou não no magento 2?

64

Como descobrir se o cliente está logado ou não no Magento 2.

Se o cliente estiver conectado, como obter dados do cliente da sessão?

Rakesh Jesadiya
fonte
nenhuma das soluções mencionadas aqui funcionou para mim. @ Rakesh: você poderia compartilhar como isso funcionou para você?
Ipsita Rout
Lembre-se de que, se você precisar verificar o status de logon de dentro de um módulo Magento JS ( text/x-magento-init), poderá economizar um pouco de sobrecarga, evitando a instanciação do ObjectManager e passando o status ao objeto de configuração do módulo. Em vez disso, consulte o link de login em dentro do módulo JS, por exemplo:var isLoggedIn = $('.authorization-link > a').attr('href').indexOf('/login')<0;
thdoan
11
O que a linha abaixo está fazendo? var isLoggedIn = $ ('. link de autorização> a'). attr ('href'). indexOf ('/ login') <0;
Jaisa
Verifique o link, rakeshjesadiya.com/…
Rakesh Jesadiya

Respostas:

62

Seguindo o código, você pode verificar o login do cliente ou não em qualquer lugar

$ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance ();
$ customerSession = $ objectManager-> get ('Magento \ Cliente \ Modelo \ Sessão');
if ($ customerSession-> isLoggedIn ()) {
   // ação de login do cliente
}

Do controlador

$ this -> _ objectManager-> get ('Magento \ Cliente \ Modelo \ Sessão');
if ($ customerSession-> isLoggedIn ()) {
   // ação de login do cliente
}
Sohel Rana
fonte
11
Obviamente, é a solução mais evidente, e eu a empreguei pela primeira vez, mas notei que ela não funciona corretamente quando a sessão do cliente ainda não foi inicializada, então encontrei uma solução menos evidente, mas mais sustentável.
Mage2.PRO
11
Não se deve usar o gerenciador de objetos diretamente. Simplesmente injete o código gerado pelo ObjectFactory para o modelo de sessão.
CarComp 13/04/2019
6
por favor, não copie outras respostas na sua resposta.
Marius
6
esse é o caminho "errado", a resposta de Rafael no Digital Pianism é a correta #
Lorenzo
11
Se você ativou o cache de página inteira e o chama em bloco / modelo, ele não funciona, pois a sessão do cliente sempre retornará vazia. Use o contexto http para verificá-lo.
Leo
84

Lembrete importante: nunca se deve chamar o gerenciador de objetos diretamente

Então, aqui está como fazê-lo da maneira limpa

Em qualquer classe, exceto modelos

Você primeiro precisa injetar a seguinte classe em seu construtor /Magento/Customer/Model/Session:

protected $_session;

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

Em sua classe, você pode ligar para o seguinte:

if ($this->_session->isLoggedIn()) {
    // Customer is logged in 
} else {
    // Customer is not logged in
}

Em um modelo

Isso requer um pouco mais de trabalho em um modelo, pois você terá que configurar uma preferência para o bloco que renderiza o modelo para fazer isso da maneira limpa:

<preference for="Block\That\Renders\The\Template"
            type="Vendor\Module\Block\Your\Custom\Block" />

Em seguida, no seu controlador de bloco personalizado, você precisa seguir a mesma injeção de dependência de qualquer classe (explicada acima).

A etapa extra aqui é criar um método público que possa ser usado em seu modelo para verificar se um cliente está logado ou não

public function isCustomerLoggedIn()
{
    return $this->_session->isLoggedIn();
}

Em seu modelo, você pode ligar para:

if ($block->isCustomerLoggedIn()) {
    // Customer is logged in
} else {
    // Customer is not logged in
}

Alternativa se a sessão do cliente ainda não foi inicializada

Há outra maneira de fazer isso, que implica usar em Magento\Framework\App\Http\Contextvez deMagento/Customer/Model/Session

Em seguida, você pode ligar em $this->_context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH)vez de $this->_session->isLoggedIn()verificar se o cliente está logado ou não.

No entanto, esse método pode fornecer resultados diferentes . Sugiro que você leia esta ótima resposta para obter mais informações: https://magento.stackexchange.com/a/92133/2380

Raphael na Digital Pianism
fonte
Onde deve ser colocada a <preference ... />tag em um tema personalizado? O que são exatamente Block\That\Renders\The\Templatee Vendor\Module\Block\Your\Custom\Block?
Andrea
@ Andrea bem, depende e é diferente para cada caso. É por isso que eu usei nomes de caminho de classe genéricos na minha resposta
Raphael em Digital pianismo
Eu tenho um bloco personalizado definido como class Html extends \Magento\Framework\View\Element\Templateonde eu posso injetar o objeto de sessão no construtor. Eu uso este bloco dentro do meu tema personalizado desta forma (a partir de arquivos XML de layout): <block class="Vendor\ThemeName\Block\Html" template="Vendor_ModuleName::html/my-custom-template.phtml"/>. Gostaria de verificar o usuário conectado no arquivo de modelo my-custom-template.phtml. Como devo usar a tag `<preferência ... />?
Andrea Andrea
Não funciona para mim o método -> isLoggedin (). Não sei por que, mas nunca retorna que o cliente está logado, e realmente é! Está logado (estou logado).
Vladimir Despotovic 31/03
@VladimirDespotovic você testou o método alternativo?
Raphael no Pianism Digital
31

É possível via Magento\Framework\App\Http\Contextou via Magento\Customer\Model\Session. No entanto, o resultado pode ser diferente:

  • O contexto HTTP é inicializado antes da sessão do cliente (mas não importa, pois ambos são inicializados nos controladores de ação)
  • Quando o PageCachemódulo estiver ativado (provavelmente sempre em produção), lembre-se de que, assim que a geração do layout for iniciada, a sessão do cliente será limpa \Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXmlem todas as páginas armazenáveis ​​em cache. Isso significa que, se você agora verificar se o cliente está conectado via contexto HTTP, ele ainda dirá 'yes', mas os dados do cliente não estarão mais disponíveis na sessão do cliente. Portanto, é necessário verificar novamente antes de tentar acessar os dados na sessão do cliente. Isso pode acontecer facilmente em bloco, embora seja improvável no controlador de ação, já que não se espera que você gere layout manualmente, ele será gerado depois que o controlador de ação retornar a instância deResultInterface

Para eliminar qualquer risco de inconsistências descritas ao ativar o PageCache, considere usar a sessão do cliente, se já estiver inicializada (verdadeiro para controladores de ação). Caso contrário, use o contexto HTTP.

Alex Paliarush
fonte
grande dica para pagecache habilitado, thx
LucScu
3
@Alex Estou usando o código abaixo $ customerSession = $ objectManager-> get ('Magento \ Framework \ App \ Http \ Context'); $ isLoggedIn = $ customerSession-> getValue (\ Magento \ Cliente \ Modelo \ Context :: CONTEXT_AUTH); Mas, devido ao cache, ative a opção Entrar, em vez de Sair do cliente conectado. Como devo corrigir isso?
Nitesh
Isso nos mordeu, obrigado. Sua resposta precisa de mais atenção :-) O cache ativado na produção dificulta a sessão. Coloque cachable = false no arquivo XML da rota se estiver escrevendo plugins magento personalizados.
Ligemer 13/11/19
2
por que você tem que colocar cachable = false?
precisa saber é o seguinte
15
/** @var \Magento\Framework\App\ObjectManager $om */
$om = \Magento\Framework\App\ObjectManager::getInstance();
/** @var \Magento\Framework\App\Http\Context $context */
$context = $om->get('Magento\Framework\App\Http\Context');
/** @var bool $isLoggedIn */
$isLoggedIn = $context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH);
Mage2.PRO
fonte
Então, como obter o custommer é login @ Mage2.PRO?
xanka 6/12/15
8
Você nunca deve usar ObjectManager diretamente
7ochem
Sim combinado. O Objectmanager não é o caminho a seguir. Injete o CustomerFactory no construtor da classe.
CarComp
A solução acima não funciona comigo
Ipsita Rout
@lpsita Deixe-me saber se você tem esse problema? Eu apenas fixo ele :)
Jai
10

Nenhuma dessas soluções funcionou para mim. Algumas páginas parecem estar conectadas, mas outras não. Parece que este é o erro:

https://github.com/magento/magento2/issues/3294

Acabei criando um auxiliar que eu poderia chamar nos meus modelos:

<?php
namespace MyVendor\MyModule\Helper;

use Magento\Framework\App\Helper\AbstractHelper;

/**
 * Created by Carl Owens ([email protected])
 * Company: PartFire Ltd (www.partfire.co.uk)
 **/
class Data extends AbstractHelper
{
    /**
     * @var \Magento\Framework\App\Http\Context
     */
    private $httpContext;

    public function __construct(
        \Magento\Framework\App\Helper\Context $context,
        \Magento\Framework\App\Http\Context $httpContext
    ) {
        parent::__construct($context);
        $this->httpContext = $httpContext;
    }

    public function isLoggedIn()
    {
        $isLoggedIn = $this->httpContext->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH);
        return $isLoggedIn;
    }
}

Então eu poderia usar o auxiliar nos meus modelos da seguinte maneira:

<?php
$helper = $this->helper('MyVendor\MyModule\Helper\Data');

if ($helper->isLoggedIn()) {
    //show something
}
Carl Owens
fonte
É verdade, o único código que funcionou em mim é o seu. Obrigado!
George George
Como posso ligar ->getCustomer()->getName()usando o contexto, porque Se eu usar a Sessão não está funcionando para todas as páginas.
5137 George George # 1
se o cache de página inteira estiver ativado, esta é a resposta certa. Você pode verificar a sessão do cliente primeiro e, se isso retornar falso, você poderá fazer isso
CompactCode
9

Para fazer o login do usuário no modelo, você pode simplesmente chamar o auxiliar em apenas uma única linha:

<?php $_loggedin = $this->helper('Magento\Checkout\Helper\Cart')->getCart()->getCustomerSession()->isLoggedIn(); ?>

<?php if( $_loggedin ) : ?>

     <div><!-- add your code --></div>

<?php endif; ?>
Afham
fonte
Solução agradável sem usar o gerenciador de objetos.
Nitesh
2
Isso não funcionou na v2.1.5 com o FPC e o Varnish ativados no modo de produção.
thdoan
8

Nenhuma das soluções aqui funcionou para mim de forma confiável no Magento v2.1, com o cache de página completo e o verniz ativados no modo de produção. Finalmente encontrei uma solução que funcionava 100% do tempo com todo o cache ativado depois de ter a idéia vendor/magento/module-theme/view/frontend/templates/html/header.phtml. Aqui está minha solução, que mostra um link "Logon" quando o usuário está desconectado e um link "Logout" quando o usuário está logado:

<li data-bind="scope: 'customer'">
  <!-- ko if: customer().firstname  -->
  <a href="<?php echo $this->getUrl('customer/account/logout'); ?>" style="display:none;" data-bind="style: {display:'inline'}"><?php echo __('Sign Out') ?></a>
  <!-- /ko -->
  <!-- ko ifnot: customer().firstname  -->
  <a href="<?php echo $this->getUrl('customer/account/login'); ?>" style="display:none;" data-bind="style: {display:'inline'}"><?php echo __('Sign In') ?></a>
  <!-- /ko -->
  <script type="text/x-magento-init">
  {
    "*": {
      "Magento_Ui/js/core/app": {
        "components": {
          "customer": {
            "component": "Magento_Customer/js/view/customer"
          }
        }
      }
    }
  }
  </script>
</li>

ATUALIZAÇÃO: Desde a v2.1.5, esta solução não é mais confiável. Consulte o problema 9156 para obter uma solução.

thdoan
fonte
É uma boa solução. Embora você possa usar cachable = "false" no arquivo de layout.
Dinesh Yadav
Eu tenho cachable="false"no layout XML para este bloco, mas o verniz ainda está em cache, aparentemente. Não tenho certeza se isso é um bug ou não, mas o Knockout é uma boa maneira de contornar isso. A única desvantagem é que há um pequeno atraso antes que o link Entrar / Sair apareça devido à vinculação por KO.
thdoan
6

Existem muitas respostas por aí que são mais ou menos assim ...

OBTENHA O GERENCIADOR DE OBJETOS CARREGAR MODELO DE CLASSE DO MATERIAL

Esta é a metodologia ERRADA para usar no Magento2.0. Na 2.0, as fábricas de objetos gerados automaticamente são o caminho a percorrer. Você pode injetá-los em seu construtor em quase qualquer classe e usá-los. Exemplo:

public function __construct(
            Context $context,
            CollectionFactory $cmspageCollectionFactory,
            array $data = [],
            CustomerFactory $customerFactory,
            SessionFactory $sessionFactory)
        {
            parent::__construct($context, $data);
            $this->_cmspageCollectionFactory = $cmspageCollectionFactory;
            $this->customerFactory = $customerFactory;
            $this->sessionFactory = $sessionFactory;
        }

        /**
         * @return \Stti\Healthday\Model\ResourceModel\Cmspage\Collection
         */
        public function getCmspages()
        {
            // First check to see if someone is currently logged in.
            $customerSession = $this->sessionFactory->create();
            if ($customerSession->isLoggedIn()) {
                // customer is logged in;
                //$customer = $this->customerFactory->create()->get
            }
CarComp
fonte
2
Se você receber um erro nas fábricas, use o caminho completo, por exemplo \Magento\Customer\Model\SessionFactory $sessionFactory.
thdoan
Corrigir. Eu costumo declará-los no topo, apenas para que meus métodos não parecer uma grande confusão :)
CarComp
3

Olá, tenho resposta aqui:

$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();

    echo $customerSessionget->getCustomer()->getName();  // get  Full Name
    echo $customerSessionget->getCustomer()->getEmail(); // get Email
}

Fonte .

$customerSession = $objectManager->get('Magento\Customer\Model\Session');

Substituído get com create agora funciona bem:

$customerSession = $objectManager->create('Magento\Customer\Model\Session');
Manish
fonte
4
Você nunca deve usar ObjectManagerdiretamente
7ochem
Isso funciona apenas se o cache estiver desativado, não no cache ativado.
Jai
@Jai, esse trabalho para mim também em desenvolvimento e produção. Você pode me enviar as etapas para reproduzir o problema?
Manish
Eu tenho que verificar se o usuário está logado ou não. Mas o código abaixo funciona apenas no cache desativado $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ customerSession = $ objectManager-> create ('Magento \ Cliente \ Modelo \ Sessão'); if ($ customerSession-> isLoggedIn ()) {// CODE}
Jai
Ativar em cache: funciona apenas em páginas do painel personalizado que não estão na página inicial e em outras páginas do site. Minha pergunta: magento.stackexchange.com/q/177964/29175
Jai
3

Essa também é uma das soluções "Verifique se o cliente está logado ou não no Magento2"

Experimente o código abaixo:

 $om = \Magento\Framework\App\ObjectManager::getInstance();
 $context = $om->get('Magento\Framework\App\Http\Context');
 $isLoggedIn = $context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH);
 if($isLoggedIn){
      echo "Yes Customer loggedin";
      echo "<pre>";print_r($context->getData()); 
 }
Soundararajan m
fonte
2

Experimente o código abaixo:

<?php
namespace YourCompany\ModuleName\Helper;

class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
    public function __construct(
        \Magento\Framework\App\Helper\Context $context,
        \Magento\Customer\Model\Session $customerSession
    ) {
        $this->customerSession = $customerSession;
        parent::__construct($context);
    }

public function isLoggedIn() // You can use this fucntion in any phtml file
    {
        return $this->customerSession->isLoggedIn();
    }
}

Para usar o código acima no arquivo phtml, você pode chamar a função isLoggedIn () como:

<?php $helper = $this->helper('YourCompany\ModuleName\Helper\Data'); ?>
<?php if($helper->isLoggedIn()) : ?>
    logged in
<?php else : ?>
    not logged in
<?php endif; ?> 

Espero que esta ajuda, obrigado.

Shubham Khandelwal
fonte
oi @Shubdham, não está funcionando ..
jafar pinjar 21/03
Esta é uma solução limpa. obrigado
Ask Bytes
Sim, obrigado, espero que ajude você.
Shubham Khandelwal
2

Eu tenho a melhor solução. É baseado na autenticação do cliente . Algumas das sessões do cliente do caso não estavam funcionando, mas sempre que minha solução funcionava. Vamos dar uma olhada.

<?php
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$customerSession = $objectManager->get('Magento\Customer\Block\Account\AuthorizationLink');
if ($customerSession->isLoggedIn() == true) {
//your code.
} ?>

Obrigado.

Rafiqul Islam
fonte
1

Solução atualmente trabalhada (IMHO)

<?php

namespace My\Module\Helper\Data;

/**
 * @var \Magento\Framework\ObjectManagerInterface
 */
protected $objectManager;

/**
 * @var \Magento\Customer\Model\SessionFactory
 */
protected $customerSession;

/**
 * Class Data
 */
class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
    /**
     * @param \Magento\Framework\ObjectManagerInterface $objectManager
     */
    public function __construct(
         \Magento\Framework\ObjectManagerInterface $objectManager
    )
    {
        $this->objectManager   = $objectManager;
        $this->customerSession = $this->objectManager->create('Magento\Customer\Model\SessionFactory')->create();
    }

    /**
     * @return \Magento\Customer\Model\SessionFactory
     */
    public function getCustomerSession()
    {
       return $this->customerSession;     
    }

    /**
     * @return bool
     */
    public function isCustomerLoggedIn()
    {
        return ($this->getCustomerSession()->isLoggedIn()) ? true : false;
    }
}
coresh
fonte
1

Se você deseja verificar o cliente conectado ou não, use esse código nos arquivos phtml,

$om = \Magento\Framework\App\ObjectManager::getInstance();
$appContext = $om->get('Magento\Framework\App\Http\Context');
$isLoggedIn = $appContext->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH);
if($isLoggedIn) {
    /** LOGGED IN CUSTOMER, this should work in template   **/
}
Purvesh
fonte
2
Você nunca deve usar ObjectManagerdiretamente e nunca deve usar esse tipo de código em um modelo. Você deve criar funcionalidades em sua classe de bloco para gerenciar isso.
7ochem
Depois de saber como fazê-lo corretamente, você se pergunta como consegue fazer o contrário!
CarComp
0
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$customerSession = $objectManager->get('Magento\Customer\Model\Session');

if($customerSession->isLoggedIn()) {

}
Divya
fonte
0

Outra resposta:

<?php $_loggedin = $block->getLayout()->createBlock('Magento\Customer\Block\Account\AuthorizationLink')->isLoggedIn() ?>
 <?php if( $_loggedin ) : ?>
   // your code
 <?php endif; ?>

O que você acha?

xanka
fonte
0

Obter o status registrado do modelo Session não funcionará se você desejar usá-lo após ativar o cache FPC padrão do Magento; nesse caso, você deverá usar o SessionFactory.

A sessão não é iniciada se o cache do FPC estiver ativado, detalhes: https://github.com/magento/magento2/issues/3294#issuecomment-328464943

Para resolver isso, você deve usar SessionFactory, por exemplo:

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

public function __construct(
    ....
    \Magento\Customer\Model\SessionFactory $customerSessionFactory
    ....
) 
{
    ....
    $this->_customerSessionFactory = $customerSessionFactory;
    ....
}

public function getCustomerId(){
  $customer = $this->_customerSessionFactory->create();
  echo $customer->getCustomer()->getId();
}
Wolfack
fonte
-1

Eu tentei várias maneiras encontradas no google, mas nenhuma solução funciona. SO, verifiquei a funcionalidade principal e criei um arquivo php para verificar se um cliente está logado ou não sem usar o Gerenciador de Objetos.


            / **
         * Sessão do cliente
         * Módulo criado por códigos de tecnologia da Web
         * Desenvolvido por Vinay Sikarwar
         * @var \ Magento \ Framework \ App \ Http \ Context
         * /
        sessão protegida $;

        / **
         * Construtor de registro.
         * @param Contexto $ context
         * @param array $ data
         * /
        função pública __construct (
            Contexto $ context,
                    \ Magento \ Framework \ Session \ Generic $ session,
            array $ data
        )
        {
                    $ this -> _ session = $ session;
                    parent :: __ construct ($ context, $ data);
        }

            / **
         * Verificando o status de login do cliente
         *
         * @api
         * @return bool
         * /
        função pública isCustomerLoggedIn ()
        {
            return (bool) $ this-> getCustomerId ()
                && $ this-> checkCustomerId ($ this-> getId ())
                &&! $ this-> getIsCustomerEmulated ();
        }
    }

Para mais informações, verifique aqui http://blog.webtechnologycodes.com/customer-loggedin-check-magento2

Vinay Sikarwar
fonte