Comment vérifier si le client est connecté ou non à magento 2?


64

Comment savoir si un client est connecté ou non à Magento 2.

Si le client est connecté, comment obtenir les données client de la session?


Aucune des solutions mentionnées ici n'a fonctionné pour moi. @Rakesh: pourriez-vous partager comment cela a fonctionné pour vous?
Ipsita Rout

N'oubliez pas que si vous devez vérifier le statut de connexion depuis un module Magento JS ( text/x-magento-init), vous pouvez économiser un temps système en évitant l'instanciation d'ObjectManager et en transmettant le statut à l'objet de configuration du module. Vous pouvez également demander le lien de connexion dans le module JS, par exemple:var isLoggedIn = $('.authorization-link > a').attr('href').indexOf('/login')<0;
jeudi


1
Que fait la ligne ci-dessous? var isLoggedIn = $ ('. autorisation-lien> a'). attr ('href'). indexOf ('/ login') <0;
Jaisa

Réponses:


62

Après le code, vous pouvez vérifier la connexion du client ou pas n'importe où

$ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance ();
$ customerSession = $ objectManager-> get ('Magento \ Client \ Modèle \ Session');
if ($ customerSession-> isLoggedIn ()) {
   // action de connexion du client
}

Du contrôleur

$ this -> _ objectManager-> get ('Magento \ Client \ Modèle \ Session');
if ($ customerSession-> isLoggedIn ()) {
   // action de connexion du client
}

1
Bien sûr, il s’agit de la solution la plus évidente, que j’avais employée pour la première fois, mais j’ai ensuite remarqué qu’elle ne fonctionnait pas correctement lorsque la session client n’était pas encore initialisée. J’ai donc trouvé une solution moins évidente, mais plus durable.
Mage2.PRO

11
Il ne faut pas utiliser directement objectmanager. Injectez simplement le code généré par ObjectFactory pour le modèle de session.
CarComp

6
veuillez ne pas copier d'autres réponses dans votre réponse.
Marius

6
c'est la "mauvaise" façon, la réponse de Raphaël au Digital Pianism est la meilleure
Lorenzo

1
Si vous avez activé le cache de page complet et que vous appelez cela en bloc / modèle, cela ne fonctionne pas car la session client retournera toujours vide. Utilisez le contexte http pour le vérifier à la place.
leo

84

Rappel important: il ne faut jamais appeler directement le gestionnaire d'objets

Voici donc comment le faire de façon propre

Dans toutes les classes sauf les modèles

Vous devez d’abord injecter la classe suivante dans votre constructeur /Magento/Customer/Model/Session:

protected $_session;

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

Ensuite, dans votre classe, vous pouvez appeler le suivant:

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

Dans un modèle

Cela nécessite un peu plus de travail dans un modèle car vous devrez configurer une préférence pour le bloc qui le rend propre à le faire:

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

Ensuite, dans votre contrôleur de bloc personnalisé, vous devez suivre la même injection de dépendance que pour toute classe (expliquée ci-dessus).

L' étape supplémentaire consiste à créer une méthode publique pouvant être utilisée dans votre modèle pour vérifier si un client est connecté ou non.

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

Ensuite, dans votre modèle, vous pouvez appeler:

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

Alternative si la session client n'est pas encore initialisée

Il y a une autre façon de le faire qui implique d'utiliser Magento\Framework\App\Http\Contextau lieu deMagento/Customer/Model/Session

Ensuite, vous pouvez appeler $this->_context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH)au lieu de $this->_session->isLoggedIn()vérifier si le client est connecté ou non.

Cependant, cette méthode pouvant donner des résultats différents , je vous suggère de lire cette excellente réponse pour plus d'informations: https://magento.stackexchange.com/a/92133/2380


Où placer la <preference ... />balise dans un thème personnalisé? Que sont exactement Block\That\Renders\The\Templateet Vendor\Module\Block\Your\Custom\Block?
Andrea

@Andrea, ça dépend et c'est différent pour chaque cas. C'est pourquoi j'ai utilisé des noms de chemin de classe génériques dans ma réponse
Raphael au Digital Pianism

J'ai un bloc personnalisé défini comme l' class Html extends \Magento\Framework\View\Element\Templateendroit où je peux injecter l'objet de session dans le constructeur. J'utilise ce bloc dans mon thème personnalisé de cette manière ( à partir de fichiers xml de mise en page): <block class="Vendor\ThemeName\Block\Html" template="Vendor_ModuleName::html/my-custom-template.phtml"/>. Je voudrais vérifier l'utilisateur connecté dans le fichier de modèle my-custom-template.phtml. Comment devrais-je utiliser la balise `<préférence ... />?
Andrea

Ne fonctionne pas pour moi la méthode -> isLoggedin (). Je ne sais pas pourquoi mais il ne retourne jamais que le client est connecté, et c'est en fait! Il est connecté (je suis connecté).
Vladimir Despotovic

@ Vladimir Despotovic avez-vous testé la méthode alternative?
Raphael au pianisme numérique

31

C'est possible via Magento\Framework\App\Http\Contextou via Magento\Customer\Model\Session. Cependant, le résultat peut être différent:

  • Le contexte HTTP est initialisé avant la session client (mais cela n'a pas d'importance, car les deux sont initialisés dans des contrôleurs d'action)
  • Lorsque le PageCachemodule est \Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXmlactivé (probablement toujours en production), gardez à l'esprit que dès que la génération de la présentation a commencé, la session du client est effacée de toutes les pages pouvant être mises en cache. Cela signifie que si vous vérifiez maintenant si le client est connecté via HTTP, il indiquera toujours «oui», mais les données du client ne seront plus disponibles dans la session client. Un double contrôle est donc nécessaire avant d'essayer d'accéder aux données dans une session client. Cela peut facilement se produire en bloc, bien qu’il soit improbable dans le contrôleur d’action puisque vous n’êtes pas censé y générer manuellement la présentation, elle sera générée après que le contrôleur d’action ait renvoyé une instance deResultInterface

Pour éliminer tout risque d'incohérence décrite lorsque PageCache est activé, envisagez d'utiliser une session client si celle-ci est déjà initialisée (true pour les contrôleurs d'action). Sinon, utilisez le contexte HTTP.


excellent indice pour PageCache activé, thx
LucScu

3
@Alex J'utilise le code ci-dessous $ customerSession = $ objectManager-> get ('Magento \ Framework \ App \ Http \ Context'); $ isLoggedIn = $ customerSession-> getValue (\ Magento \ Client \ Modèle \ Contexte :: CONTEXT_AUTH); Mais en raison du cache, activez-la en affichant l'option de connexion au lieu de la déconnexion pour le client connecté. Comment dois-je résoudre ce problème?
Nitesh

Ce mors nous dans le cul, merci. Votre réponse nécessite plus d'attention :-) Le cache activé en production rend la session difficile. Mettez cachable = false dans le fichier XML de la route si vous écrivez des plugins magento personnalisés.
Ligemer

2
pourquoi faut-il mettre cachable = false?
LucScu

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

Alors, comment se connecter est login @ Mage2.PRO?
xanka

8
Vous ne devez jamais utiliser ObjectManager directement
7ochem

Oui, d'accord Objectmanager n'est pas la voie à suivre. Injectez CustomerFactory dans le constructeur de la classe.
CarComp

La solution ci-dessus ne fonctionne pas pour moi
Ipsita Rout

@ lpsita Faites-moi savoir si vous avez ce problème? Je viens de le réparer :)
Jai

11

Aucune de ces solutions n'a fonctionné pour moi. Certaines pages semblent être connectées mais d'autres pas. Il semble que ce soit le bug:

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

J'ai fini par créer un assistant que je pouvais appeler dans mes modèles:

<?php
namespace MyVendor\MyModule\Helper;

use Magento\Framework\App\Helper\AbstractHelper;

/**
 * Created by Carl Owens (carl@partfire.co.uk)
 * 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;
    }
}

Ensuite, je pourrais utiliser l’assistant dans mes modèles comme suit:

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

if ($helper->isLoggedIn()) {
    //show something
}

C'est vrai, le seul code qui a fonctionné sur moi est le vôtre. Je vous remercie!
George George

Comment puis-je appeler en ->getCustomer()->getName()utilisant le contexte, car si j'utilise la session ne fonctionne pas pour toutes les pages.
George George

Si le cache de page complet est activé, c'est la bonne réponse. Vous pouvez vérifier d'abord la session client et si cela retourne la valeur false, vous pouvez le faire
CompactCode

9

Pour que l'utilisateur soit connecté au modèle, vous pouvez simplement appeler helper sur une seule ligne:

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

<?php if( $_loggedin ) : ?>

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

<?php endif; ?>

Belle solution sans utiliser objectmanager.
Nitesh

2
Cela ne fonctionnait pas dans la version 2.1.5 lorsque FPC et Varnish étaient activés en mode de production.
thdoan

8

Aucune des solutions présentées ici ne fonctionnait de manière fiable dans Magento v2.1 avec la protection contre le cache Page complet et Varnish activées en mode Production. J'ai finalement trouvé une solution qui fonctionnait 100% du temps avec toute la mise en cache activée après avoir eu l'idée vendor/magento/module-theme/view/frontend/templates/html/header.phtml. Voici ma solution, qui affiche un lien "Sign In" lorsque l'utilisateur est déconnecté et un lien "Déconnexion" lorsque l'utilisateur est connecté:

<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>

MISE À JOUR: Depuis la version 2.1.5, cette solution n'est plus fiable. Voir le numéro 9156 pour une solution.


C'est une bonne solution. Bien que vous puissiez utiliser cachable = "false" dans le fichier de mise en page.
Dinesh Yadav

J'ai cachable="false"dans la mise en page XML pour ce bloc, mais le vernis le cache toujours apparemment. Pas sûr que ce soit un bug ou non, mais Knockout est un bon moyen de le contourner. Le seul inconvénient est qu'il reste un peu de temps avant que le lien Sign In / Out ne s'affiche en raison de la liaison KO.
thdoan

6

Il y a beaucoup de réponses là-bas qui vont quelque chose comme ça ...

OBTENIR UN GESTIONNAIRE D'OBJETS MODÈLE DE CLASSEMENT

C'est la méthodologie WRONG à utiliser dans Magento 2.0. En 2.0, les fabriques d'objets générées automatiquement sont la solution. Vous pouvez les injecter dans votre constructeur dans presque toutes les classes et les utiliser. Exemple:

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
            }

2
Si vous obtenez une erreur pour les usines, utilisez le chemin complet, par exemple \Magento\Customer\Model\SessionFactory $sessionFactory.
thdoan

Correct. Je les déclare habituellement au sommet, juste pour que mes méthodes ne ressemblent pas à un énorme gâchis :)
CarComp

3

Bonjour a la réponse ici:

$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
}

Source .

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

Remplacer get par create fonctionne maintenant très bien:

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

4
Vous ne devriez jamais utiliser ObjectManagerdirectement
7ochem

Cela ne fonctionne que si le cache est désactivé et non dans enabled-cache.
Jai

@ Jai, cela fonctionne aussi pour moi dans le développement et la production. Pouvez-vous m'envoyer les étapes pour reproduire le problème?
Manish

Je dois vérifier si l'utilisateur est connecté ou non. Mais le code ci-dessous ne fonctionne que dans le cache désactivé $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ customerSession = $ objectManager-> create ('Magento \ Client \ Modèle \ Session'); if ($ customerSession-> isLoggedIn ()) {// CODE}
Jai

Dans enable mis en cache: il ne fonctionne que sur les pages de tableau de bord personnalisé, pas dans la page d'accueil et les autres pages du site. Ma question: magento.stackexchange.com/q/177964/29175
Jai

3

C’est aussi l’une des solutions "Vérifier si le client est connecté ou non à Magento2"

Essayez ci-dessous le code:

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

2

Essayez ci-dessous le code:

<?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();
    }
}

Pour utiliser le code ci-dessus dans un fichier phtml, vous pouvez appeler la fonction isLoggedIn () en tant que:

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

J'espère que cette aide merci.


salut @ Shubdham, ça ne marche pas ..
jafar pinjar

c'est une solution soignée. merci
Ask Bytes

Oui merci j'espère que ça vous aide.
Shubham Khandelwal

2

J'ai la meilleure solution. Il est basé sur l' authentification du client . Une partie de la session cliente ne fonctionnait pas, mais chaque fois que ma solution fonctionnerait. Nous allons jeter un coup d'oeil.

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

Merci.


1

Solution actuellement utilisée (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;
    }
}

1

Si vous voulez vérifier le client connecté ou non, utilisez ce code dans les fichiers 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   **/
}

2
Vous ne devriez jamais utiliser ObjectManagerdirectement et vous ne devriez jamais utiliser ce type de code dans un modèle. Vous devez créer des fonctionnalités dans votre classe de bloc pour gérer cela.
7ochem

Une fois que vous savez comment le faire correctement, vous vous demandez comment vous avez réussi à le faire dans l'autre sens!
CarComp

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

if($customerSession->isLoggedIn()) {

}

0

Une autre réponse:

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

Qu'est-ce que tu penses?


0

L'extraction du statut enregistré à partir du modèle de session ne fonctionnera pas si vous souhaitez l'utiliser après avoir activé le cache FPC par défaut de Magento. Dans ce cas, vous devez utiliser SessionFactory à la place.

La session n'est pas lancée si la mise en cache FPC est activée, détails: https://github.com/magento/magento2/issues/3294#issuecomment-328464943.

Pour résoudre ce problème, vous devez utiliser SessionFactory, par exemple:

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

-1

J'ai essayé de nombreuses manières trouvées sur Google mais aucune des solutions ne fonctionne. J'ai donc vérifié la fonctionnalité principale et créé un fichier php pour vérifier si un client est connecté ou non sans utiliser le gestionnaire d'objets.


            / **
         * Session client
         * Module créé par Web Technology Codes
         * Développé par Vinay Sikarwar
         * @var \ Magento \ Framework \ App \ Http \ Contexte
         * /
        session protégée;

        / **
         * Constructeur d'enregistrement.
         * @param Context $ context
         * @param array $ data
         * /
        fonction publique __construct (
            Context $ context,
                    \ Magento \ Framework \ Session \ Generic $ session,
            tableau $ data
        )
        {
                    $ this -> _ session = $ session;
                    parent :: __ construct ($ context, $ data);
        }

            / **
         * Vérification de l'état de connexion du client
         *
         * @api
         * @return bool
         * /
        fonction publique isCustomerLoggedIn ()
        {
            return (bool) $ this-> getCustomerId ()
                && $ this-> checkCustomerId ($ this-> getId ())
                &&! $ this-> getIsCustomerEmulated ();
        }
    }

Pour plus d'informations, voir ici http://blog.webtechnologycodes.com/customer-loggedin-check-magento2

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.