¿Cómo verificar si el cliente ha iniciado sesión o no en magento 2?

64

Cómo saber si el cliente ha iniciado sesión o no en Magento 2.

Si el cliente ha iniciado sesión, ¿cómo obtener los datos del cliente de la sesión?

Rakesh Jesadiya
fuente
Ninguna de las soluciones mencionadas aquí funcionó para mí. @Rakesh: ¿podría compartir cómo funcionó para usted?
Ipsita Rout
Tenga en cuenta que si alguna vez necesita verificar el estado de text/x-magento-initinicio de sesión desde un módulo Magento JS ( ), puede ahorrar un poco de sobrecarga evitando la creación de instancias de ObjectManager y pasando el estado al objeto de configuración del módulo, y en su lugar consulte el enlace de inicio de sesión desde dentro del módulo JS, por ejemplo:var isLoggedIn = $('.authorization-link > a').attr('href').indexOf('/login')<0;
thdoan
1
¿Qué está haciendo la línea de abajo? var isLoggedIn = $ ('. autorización-enlace> a'). attr ('href'). indexOf ('/ login') <0;
Jaisa
Compruebe el enlace, rakeshjesadiya.com/…
Rakesh Jesadiya

Respuestas:

62

El siguiente código puede verificar el inicio de sesión del cliente o no en ningún lugar

$ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance ();
$ customerSession = $ objectManager-> get ('Magento \ Customer \ Model \ Session');
if ($ customerSession-> isLoggedIn ()) {
   // acción de inicio de sesión del cliente
}

Desde el controlador

$ this -> _ objectManager-> get ('Magento \ Customer \ Model \ Session');
if ($ customerSession-> isLoggedIn ()) {
   // acción de inicio de sesión del cliente
}
Sohel Rana
fuente
1
Por supuesto, es la solución más evidente, y la empleé por primera vez, pero luego noté que no funciona correctamente cuando la sesión del cliente aún no se ha inicializado, por lo que he encontrado una solución menos evidente pero más sostenible.
Mage2.PRO
11
Uno no debe usar objectmanager directamente. Simplemente inyecte el código generado por ObjectFactory para el modelo de sesión.
CarComp
66
por favor no copie otras respuestas en su respuesta.
Marius
66
esta es la manera "equivocada", la respuesta de Rafael en Digital Pianism es la correcta
Lorenzo
1
Si ha habilitado el caché de página completa y llama a esto en bloque / plantilla, no funciona ya que la sesión del cliente siempre volverá vacía. Utilice el contexto http para verificarlo en su lugar.
leo
84

Recordatorio importante: nunca se debe llamar al Administrador de objetos directamente

Así, aquí está cómo hacerlo de manera limpia

En cualquier clase excepto plantillas

Primero debe inyectar la siguiente clase en su constructor /Magento/Customer/Model/Session:

protected $_session;

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

Luego, en su clase, puede llamar a lo siguiente:

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

En una plantilla

Requiere un poco más de trabajo en una plantilla, ya que tendrá que configurar una preferencia para el bloque que hace que la plantilla lo haga de manera limpia:

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

Luego, en su contrusctor de bloque personalizado, debe seguir la misma inyección de dependencia que para cualquier clase (explicada anteriormente).

El paso adicional aquí es crear un método público que pueda usarse en su plantilla para verificar si un cliente ha iniciado sesión o no.

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

Luego, en su plantilla puede llamar:

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

Alternativa si la sesión del cliente aún no se ha inicializado

Hay otra forma de hacerlo que implica usar en Magento\Framework\App\Http\Contextlugar deMagento/Customer/Model/Session

Luego puede llamar en $this->_context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH)lugar de $this->_session->isLoggedIn()verificar si el cliente ha iniciado sesión o no.

Sin embargo, este método puede brindarle resultados diferentes , le sugiero que lea esta excelente respuesta para obtener más información: https://magento.stackexchange.com/a/92133/2380

Raphael en Digital Pianism
fuente
¿Dónde se debe colocar la <preference ... />etiqueta dentro de un tema personalizado? ¿Qué son exactamente Block\That\Renders\The\Templatey Vendor\Module\Block\Your\Custom\Block?
Andrea
@Andrea bueno, depende y es diferente para cada caso. Es por eso que usé nombres de ruta de clase genéricos en mi respuesta
Raphael en Digital Pianism
Tengo un bloque personalizado definido como class Html extends \Magento\Framework\View\Element\Templatedonde puedo inyectar el objeto de sesión en el constructor. Yo uso este bloque dentro de mi tema personalizado de esta manera (de archivos de diseño xml): <block class="Vendor\ThemeName\Block\Html" template="Vendor_ModuleName::html/my-custom-template.phtml"/>. Me gustaría verificar el usuario registrado dentro del archivo de plantilla my-custom-template.phtml. ¿Cómo debo usar la etiqueta `<preferencia ... />?
Andrea
No me funciona el método -> isLoggedin (). No sé por qué, pero nunca devuelve que el cliente ha iniciado sesión, ¡y realmente lo es! Está conectado (estoy conectado).
Vladimir Despotovic
@VladimirDespotovic, ¿probaste el método alternativo?
Raphael en Digital Pianism
31

Es posible vía Magento\Framework\App\Http\Contexto vía Magento\Customer\Model\Session. Sin embargo, el resultado puede ser diferente:

  • El contexto HTTP se inicializa antes de la sesión del cliente (pero no importa ya que ambos se inicializan en controladores de acción)
  • Cuando el PageCachemódulo está encendido (probablemente siempre en producción), tenga en cuenta que tan pronto como comience la generación del diseño, la sesión del cliente se borrará \Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXmlen todas las páginas almacenables en caché. Significa que si ahora verifica si el cliente ha iniciado sesión a través del contexto HTTP, seguirá diciendo 'sí', pero los datos del cliente ya no estarán disponibles en la sesión del cliente. Por lo tanto, es necesario verificar dos veces antes de intentar acceder a los datos en la sesión del cliente. Esto puede suceder fácilmente en bloque, aunque es poco probable en el controlador de acción, ya que no se espera que genere el diseño manualmente allí, se generará después de que el controlador de acción devuelva la instancia deResultInterface

Para eliminar cualquier riesgo de inconsistencias descritas cuando PageCache está activado, considere usar la sesión del cliente, si ya está inicializada (cierto para los controladores de acción). De lo contrario, use el contexto HTTP.

Alex Paliarush
fuente
gran sugerencia para PageCache habilitado, gracias
LucScu
3
@Alex estoy usando el siguiente código $ customerSession = $ objectManager-> get ('Magento \ Framework \ App \ Http \ Context'); $ isLoggedIn = $ customerSession-> getValue (\ Magento \ Customer \ Model \ Context :: CONTEXT_AUTH); Pero debido a la habilitación de caché, muestra la opción Iniciar sesión en lugar de Cerrar sesión en el cliente conectado. ¿Cómo debo arreglar esto?
Nitesh
Esto nos mordió en el culo, gracias. Su respuesta necesita más atención :-) La caché habilitada en producción dificulta la sesión. Ponga cachable = false en el archivo XML de la ruta si está escribiendo complementos personalizados de magento.
Ligemer el
2
¿por qué tienes que poner 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);
Mage2.PRO
fuente
Entonces, ¿cómo obtener custommer es login @ Mage2.PRO?
xanka
8
Nunca debe usar ObjectManager directamente
7ochem
Sí, estoy de acuerdo. Objectmanager no es el camino a seguir. Inyecte CustomerFactory en el constructor de la clase.
CarComp
La solución anterior no funciona para mí
Ipsita Rout
@lpsita Avísame si tienes este problema. Lo acabo de arreglar :)
Jai
11

Ninguna de estas soluciones funcionó para mí. Algunas páginas parecerían estar conectadas pero otras no. Parece que este es el error:

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

Terminé creando un ayudante al que podría llamar en mis plantillas:

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

Entonces podría usar el ayudante en mis plantillas así:

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

if ($helper->isLoggedIn()) {
    //show something
}
Carl Owens
fuente
Eso es cierto, el único código que funcionó en mí es el tuyo. ¡Gracias!
George George
¿Cómo puedo llamar ->getCustomer()->getName()usando el contexto, porque si uso la sesión no funciona para todas las páginas?
George George
Si la caché de página completa está habilitada, esta es la respuesta correcta. Puede verificar la
sesión del
9

Para que el usuario inicie sesión en la plantilla, simplemente puede llamar al ayudante en una sola línea:

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

<?php if( $_loggedin ) : ?>

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

<?php endif; ?>
Afham
fuente
Buena solución sin usar objectmanager.
Nitesh
2
Esto no funcionó en v2.1.5 con FPC y Varnish habilitados en modo de producción.
thdoan
8

Ninguna de las soluciones aquí funcionó para mí de manera confiable en Magento v2.1 con Full Page Cache and Varnish habilitado en modo Producción. Finalmente encontré una solución que funcionó el 100% del tiempo con todo el almacenamiento en caché habilitado después de obtener la idea vendor/magento/module-theme/view/frontend/templates/html/header.phtml. Aquí está mi solución, que muestra un enlace "Iniciar sesión" cuando el usuario cierra sesión y un enlace "Cerrar sesión" cuando el usuario inicia sesión:

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

ACTUALIZACIÓN: desde v2.1.5 esta solución ya no es confiable. Vea el problema 9156 para una solución.

Thdoan
fuente
Es una buena solucion. Aunque puede usar cachable = "false" en el archivo de diseño.
Dinesh Yadav
Tengo un cachable="false"diseño XML para este bloque, pero aparentemente el barniz todavía lo está almacenando en caché. No estoy seguro de si esto es un error o no, pero Knockout es una buena manera de sortear esto. El único inconveniente es que hay un pequeño retraso antes de que aparezca el enlace Iniciar / Cerrar sesión debido al enlace KO.
thdoan
6

Hay muchas respuestas por ahí que van más o menos así ...

OBTENGA EL GERENTE DE OBJETOS MODELO DE CLASE DE CARGA

Esta es la metodología INCORRECTA para usar en Magento2.0. En 2.0, las fábricas de objetos autogenerados son el camino a seguir. Puede inyectarlos en su constructor en casi cualquier clase y usarlos. Ejemplo:

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
fuente
2
Si obtiene un error para las fábricas, utilice la ruta completa, por ejemplo \Magento\Customer\Model\SessionFactory $sessionFactory.
thdoan
Correcto. Por lo general, los declaro en la parte superior, solo para que mis métodos no se vean como un gran desastre :)
CarComp
3

Hola tengo respuesta aquí:

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

Fuente .

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

Reemplazar get con create ahora funciona bien:

$customerSession = $objectManager->create('Magento\Customer\Model\Session');
Manish
fuente
44
Nunca debe usar ObjectManagerdirectamente
7ochem
Esto funciona solo si el caché está deshabilitado, no en habilitado-caché.
Jai
@Jai, esto también funciona para mí en desarrollo y producción. ¿Me puede enviar los pasos para reproducir el problema?
Manish
Tengo que verificar si el usuario ha iniciado sesión o no. Pero el código siguiente solo funciona en el caché deshabilitado $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ customerSession = $ objectManager-> create ('Magento \ Customer \ Model \ Session'); if ($ customerSession-> isLoggedIn ()) {// CODE}
Jai
En habilitar almacenamiento en caché: funciona solo en páginas de panel personalizado, no en la página de inicio y otras páginas del sitio. Mi pregunta: magento.stackexchange.com/q/177964/29175
Jai
3

Esta también es una de las soluciones "Compruebe si el cliente ha iniciado sesión o no en Magento2"

Pruebe el siguiente código:

 $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
fuente
2

Pruebe el siguiente código:

<?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 el código anterior en el archivo phtml, puede llamar a la función 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 ayuda, gracias.

Shubham Khandelwal
fuente
hola @Shubdham, no funciona ..
jafar pinjar
Esta es una solución ordenada. gracias
Pregunte Bytes
Sí, gracias, espero que te ayude.
Shubham Khandelwal
2

Tengo la mejor solución. Se basa en la autenticación del cliente . Algunas de las sesiones de clientes no funcionaban, pero cada vez que mi solución funcionara Vamos a ver.

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

Gracias.

Rafiqul Islam
fuente
1

Solución actual trabajada (en mi humilde opinión)

<?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
fuente
1

Si desea verificar si el cliente inició sesión o no, use este código en archivos 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
fuente
2
Nunca debe usar ObjectManagerdirectamente y nunca debe usar este tipo de código en una plantilla. Debe crear funcionalidades en su clase de bloque para gestionar esto.
7ochem
Una vez que sabes cómo hacerlo correctamente, te preguntas cómo logras hacerlo de otra manera.
CarComp
0
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$customerSession = $objectManager->get('Magento\Customer\Model\Session');

if($customerSession->isLoggedIn()) {

}
Divya
fuente
0

Otra respuesta:

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

¿Qué piensas?

xanka
fuente
0

Obtener el estado registrado del modelo de sesión no funcionará en caso de que desee usarlo después de habilitar el caché FPC predeterminado de Magento, en ese caso, debe usar SessionFactory en su lugar.

La sesión no se inicia si el almacenamiento en caché FPC está habilitado, detalles: https://github.com/magento/magento2/issues/3294#issuecomment-328464943

Para resolver esto, debe usar SessionFactory, por ejemplo:

/**
* @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
fuente
-1

Intenté muchas formas encontradas en google pero ninguna de las soluciones funciona. Entonces, verifiqué la funcionalidad principal y creé un archivo php para verificar que un cliente haya iniciado sesión o no sin usar Object Manager.


            / **
         * Sesión del cliente
         * Módulo creado por códigos de tecnología web
         * Desarrollado por Vinay Sikarwar
         * @var \ Magento \ Framework \ App \ Http \ Context
         * /
        $ sesión protegida;

        / **
         * Constructor de registro.
         * @param Context $ context
         * @param array $ data
         * /
        función pública __construct (
            Contexto $ context,
                    \ Magento \ Framework \ Session \ Generic $ session,
            array $ data
        )
        {
                    $ this -> _ session = $ session;
                    parent :: __ construct ($ context, $ data);
        }

            / **
         * Verificación del estado de inicio de sesión del cliente
         * *
         * @api
         * @return bool
         * /
        función pública isCustomerLoggedIn ()
        {
            return (bool) $ this-> getCustomerId ()
                && $ this-> checkCustomerId ($ this-> getId ())
                &&! $ this-> getIsCustomerEmulated ();
        }
    }

Para obtener más información, compruébelo aquí http://blog.webtechnologycodes.com/customer-loggedin-check-magento2

Vinay Sikarwar
fuente