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\Context
au 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