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


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
}

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


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


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

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

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

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

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

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

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.


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
            }

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

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

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.


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.


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

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   **/
}

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()) {

}

0

Otra respuesta:

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

¿Qué piensas?


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

-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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.