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?
magento2
customer
login
customer-account
customer-session
Rakesh Jesadiya
fonte
fonte
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;
Respostas:
Seguindo o código, você pode verificar o login do cliente ou não em qualquer lugar
Do controlador
fonte
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
:Em sua classe, você pode ligar para o seguinte:
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:
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
Em seu modelo, você pode ligar para:
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\Context
vez 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
fonte
<preference ... />
tag em um tema personalizado? O que são exatamenteBlock\That\Renders\The\Template
eVendor\Module\Block\Your\Custom\Block
?class Html extends \Magento\Framework\View\Element\Template
onde 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 modelomy-custom-template.phtml
. Como devo usar a tag `<preferência ... />?É possível via
Magento\Framework\App\Http\Context
ou viaMagento\Customer\Model\Session
. No entanto, o resultado pode ser diferente:PageCache
mó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::afterGenerateXml
em 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.
fonte
fonte
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:
Então eu poderia usar o auxiliar nos meus modelos da seguinte maneira:
fonte
->getCustomer()->getName()
usando o contexto, porque Se eu usar a Sessão não está funcionando para todas as páginas.Para fazer o login do usuário no modelo, você pode simplesmente chamar o auxiliar em apenas uma única linha:
fonte
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:ATUALIZAÇÃO: Desde a v2.1.5, esta solução não é mais confiável. Consulte o problema 9156 para obter uma solução.
fonte
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.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:
fonte
\Magento\Customer\Model\SessionFactory $sessionFactory
.Olá, tenho resposta aqui:
Fonte .
Substituído get com create agora funciona bem:
fonte
ObjectManager
diretamenteEssa também é uma das soluções "Verifique se o cliente está logado ou não no Magento2"
Experimente o código abaixo:
fonte
Experimente o código abaixo:
Para usar o código acima no arquivo phtml, você pode chamar a função isLoggedIn () como:
Espero que esta ajuda, obrigado.
fonte
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.
Obrigado.
fonte
Solução atualmente trabalhada (IMHO)
fonte
Se você deseja verificar o cliente conectado ou não, use esse código nos arquivos phtml,
fonte
ObjectManager
diretamente e nunca deve usar esse tipo de código em um modelo. Você deve criar funcionalidades em sua classe de bloco para gerenciar isso.fonte
Outra resposta:
O que você acha?
fonte
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:fonte
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.
Para mais informações, verifique aqui http://blog.webtechnologycodes.com/customer-loggedin-check-magento2
fonte