วิธีการตรวจสอบว่าลูกค้าเข้าสู่ระบบหรือไม่ในวีโอไอพี 2?


64

จะค้นหาได้อย่างไรว่าลูกค้าเข้าสู่ระบบหรือไม่อยู่ใน Magento 2

หากลูกค้าเข้าสู่ระบบแล้วจะรับข้อมูลลูกค้าจากเซสชันอย่างไร


วิธีการแก้ปัญหาที่กล่าวถึงที่นี่ไม่ทำงานสำหรับฉัน @Rakesh: คุณสามารถแบ่งปันวิธีการทำงานให้คุณได้ไหม?
Ipsita Rout

โปรดทราบว่าหากคุณจำเป็นต้องตรวจสอบสถานะการเข้าสู่ระบบจากในโมดูล Magento JS ( text/x-magento-init) คุณสามารถบันทึกค่าใช้จ่ายบางส่วนได้โดยหลีกเลี่ยงการสร้างอินสแตนซ์ ObjectManager และส่งผ่านสถานะไปยังวัตถุกำหนดค่าของโมดูล ภายในโมดูล JS เช่น:var isLoggedIn = $('.authorization-link > a').attr('href').indexOf('/login')<0;
thdoan

@Rakesh, Coul คุณโปรดตรวจสอบสิ่งเหล่านี้magento.stackexchange.com/questions/185994/ ...... ,, magento.stackexchange.com/questions/186036/…
Jsparo30

1
บรรทัดด้านล่างกำลังทำอะไร var isLoggedIn = $ ('. การอนุญาตเชื่อมโยง> a'). attr ('href'). indexOf ('/ เข้าสู่ระบบ') <0;
Jaisa

ตรวจสอบลิงค์, rakeshjesadiya.com/…
Rakesh Jesadiya

คำตอบ:


62

รหัสต่อไปนี้คุณสามารถตรวจสอบลูกค้าเข้าสู่ระบบหรือไม่ได้ทุกที่

$ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance ();
$ customerSession = $ objectManager-> get ('Magento \ Customer \ Model \ Session');
ถ้า ($ customerSession-> isLoggedIn ()) {
   // การดำเนินการเข้าสู่ระบบลูกค้า
}

จากตัวควบคุม

$ this -> _ objectManager-> รับ (วีโอไอพี \ ลูกค้า \ รุ่น \ เซสชัน ');
ถ้า ($ customerSession-> isLoggedIn ()) {
   // การดำเนินการเข้าสู่ระบบลูกค้า
}

1
แน่นอนว่ามันเป็นทางออกที่ชัดเจนที่สุดและฉันใช้มันเป็นครั้งแรก แต่จากนั้นฉันสังเกตเห็นว่ามันไม่ทำงานอย่างถูกต้องเมื่อยังไม่เริ่มต้นเซสชันของลูกค้าดังนั้นฉันจึงพบวิธีแก้ปัญหาที่ชัดเจน แต่ยั่งยืนกว่า
Mage2.PRO

11
ไม่ควรใช้ objectmanager โดยตรง เพียงฉีดโค้ดที่สร้างขึ้นโดย ObjectFactory สำหรับโมเดลเซสชัน
CarComp

6
โปรดอย่าคัดลอกคำตอบอื่น ๆ ในคำตอบของคุณ
Marius

6
นี่เป็นวิธีที่ "ผิด" คำตอบจากราฟาเอลที่นักเปียโนดิจิตอลคือผู้ที่เข้มงวด
Lorenzo

1
หากคุณเปิดใช้งานแคชแบบเต็มหน้าและคุณเรียกสิ่งนี้ในบล็อก / เทมเพลตมันไม่ทำงานเนื่องจากเซสชั่นลูกค้าจะกลับมาว่างเปล่าเสมอ ใช้บริบท http เพื่อตรวจสอบแทน
leo

84

การแจ้งเตือนที่สำคัญ: เราไม่ควรเรียก Object Manager โดยตรง

ดังนั้นนี่คือ วิธีการทำความสะอาด

ในชั้นเรียนใด ๆ ยกเว้นแม่แบบ

คุณต้องฉีดคลาสต่อไปนี้ใน Constructor ของคุณก่อน/Magento/Customer/Model/Session:

protected $_session;

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

จากนั้นในชั้นเรียนของคุณคุณสามารถเรียกสิ่งต่อไปนี้:

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

ในเทมเพลต

มันต้องใช้งานเพิ่มอีกเล็กน้อยในเทมเพลตเนื่องจากคุณจะต้องตั้งค่าการกำหนดค่าตามความชอบสำหรับบล็อกที่แสดงผลเทมเพลตเพื่อทำวิธีที่สะอาด

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

จากนั้นใน contrusctor บล็อกที่กำหนดเองของคุณคุณจะต้องติดตามฉีดเหมือนกันสำหรับชั้นเรียนใด ๆ (อธิบายข้างต้น)

ขั้นตอนพิเศษที่นี่คือการสร้างวิธีการของประชาชนที่สามารถนำมาใช้ในแม่แบบของคุณเพื่อตรวจสอบว่าลูกค้าจะเข้าสู่ระบบหรือไม่

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

จากนั้นในแม่แบบของคุณคุณสามารถโทร:

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

ทางเลือกถ้ายังไม่ได้กำหนดค่าเริ่มต้นเซสชันของลูกค้า

มีอีกวิธีหนึ่งในการทำสิ่งนั้นซึ่งหมายถึงการใช้ Magento\Framework\App\Http\ContextแทนMagento/Customer/Model/Session

จากนั้นคุณสามารถโทร$this->_context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH)แทน$this->_session->isLoggedIn()เพื่อตรวจสอบว่าลูกค้าเข้าสู่ระบบหรือไม่

อย่างไรก็ตามวิธีนี้อาจให้ผลลัพธ์ที่แตกต่างกันฉันขอแนะนำให้คุณอ่านคำตอบที่ดีสำหรับข้อมูลเพิ่มเติม: https://magento.stackexchange.com/a/92133/2380


ควรวาง<preference ... />แท็กไว้ในธีมที่กำหนดเองที่ไหน อะไรจะตรงBlock\That\Renders\The\TemplateและVendor\Module\Block\Your\Custom\Block?
Andrea

@ Andrea มันขึ้นอยู่กับมันและมันแตกต่างกันไปในแต่ละกรณี นั่นเป็นเหตุผลที่ฉันใช้ชื่อคลาสพา ธ ทั่วไปในคำตอบของฉัน
Raphael ที่ Digital Pianism

ฉันมีบล็อกที่กำหนดเองที่กำหนดว่าclass Html extends \Magento\Framework\View\Element\Templateฉันสามารถฉีดวัตถุเซสชั่นในตัวสร้าง ผมใช้บล็อกนี้ภายในรูปแบบกำหนดเองของฉันในลักษณะนี้ (จากไฟล์รูปแบบ <block class="Vendor\ThemeName\Block\Html" template="Vendor_ModuleName::html/my-custom-template.phtml"/>XML): my-custom-template.phtmlฉันต้องการที่จะตรวจสอบผู้ใช้เข้าสู่ภายในแฟ้มแม่แบบ ฉันจะใช้แท็ก `<preferences ... /> ได้อย่างไร
Andrea

ไม่ทำงานสำหรับฉันวิธี -> isLoggedin () ฉันไม่รู้ว่าทำไม แต่ไม่เคยส่งคืนลูกค้าที่ล็อกอินและจริง ๆ แล้วเป็น! มันเข้าสู่ระบบ (ฉันเข้าสู่ระบบ)
Vladimir Despotovic

@VladimirDespotovic คุณทดสอบวิธีอื่นหรือไม่
Raphael ที่ Digital Pianism

31

มันเป็นไปได้ทางหรือผ่านทางMagento\Framework\App\Http\Context Magento\Customer\Model\Sessionอย่างไรก็ตามผลลัพธ์อาจแตกต่างกัน:

  • บริบท HTTP ถูกเตรียมใช้งานก่อนหน้าเซสชันลูกค้า (แต่ไม่สำคัญเนื่องจากทั้งคู่ถูกกำหนดค่าเริ่มต้นในตัวควบคุมการดำเนินการ)
  • เมื่อPageCacheโมดูลเปิดอยู่ (อาจใช้งานตลอดเวลา) โปรดทราบว่าทันทีที่เริ่มสร้างโครงร่างเซสชันของลูกค้าจะถูกล้าง\Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXmlในทุกหน้าที่แคช หมายความว่าหากคุณตรวจสอบว่าลูกค้าลงชื่อเข้าใช้ผ่านบริบท HTTP หรือไม่จะยังคงตอบว่าใช่ แต่ข้อมูลลูกค้าจะไม่สามารถใช้งานได้ในเซสชันลูกค้าอีกต่อไป ดังนั้นจำเป็นต้องตรวจสอบซ้ำก่อนที่จะพยายามเข้าถึงข้อมูลในเซสชันลูกค้า สิ่งนี้สามารถเกิดขึ้นได้อย่างง่ายดายในบล็อกในขณะที่ไม่น่าจะอยู่ในตัวควบคุมการกระทำเนื่องจากคุณไม่ได้คาดหวังว่าจะสร้างรูปแบบด้วยตนเองที่นั่นมันจะถูกสร้างขึ้นหลังจากที่ตัวควบคุมการดำเนินการส่งคืนอินสแตนซ์ของResultInterface

เพื่อลดความเสี่ยงของความไม่สอดคล้องที่อธิบายไว้เมื่อเปิด PageCache ให้พิจารณาใช้เซสชันของลูกค้าหากมีการเริ่มต้นแล้ว (จริงสำหรับตัวควบคุมการดำเนินการ) อื่นใช้บริบท HTTP


คำแนะนำที่ดีสำหรับการเปิดใช้งาน PageCache ขอบคุณ
LucScu

3
@Alex ฉันใช้รหัสด้านล่าง $ customerSession = $ objectManager-> get ('Magento \ Framework \ App \ Http \ Context'); $ isLoggedIn = $ customerSession-> getValue (\ Magento \ Customer \ Model \ Context :: CONTEXT_AUTH); แต่เนื่องจากแคชเปิดใช้งานมันแสดงตัวเลือกเข้าสู่ระบบแทนออกจากระบบเพื่อเข้าสู่ระบบลูกค้า ฉันจะแก้ไขได้อย่างไร
Nitesh

บิตนี้เราอยู่ในตูดขอบคุณ คำตอบของคุณต้องการความสนใจมากขึ้น :-) แคชที่เปิดใช้งานในการผลิตทำให้เซสชันยาก ใส่ cachable = false ในไฟล์ XML ของเส้นทางหากคุณกำลังเขียนปลั๊กอิน magento ที่กำหนดเอง
Ligemer

2
ทำไมคุณต้องใส่ 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);

แล้ว custommer เป็น login @ Mage2.PRO อย่างไร?
xanka

8
คุณไม่ควรใช้ ObjectManager โดยตรง
7ochem

ใช่เห็นด้วย Objectmanager ไม่ใช่วิธีที่จะไป ฉีด CustomerFactory ในตัวสร้างคลาส
CarComp

วิธีแก้ปัญหาข้างต้นใช้ไม่ได้สำหรับฉัน
Ipsita Rout

@lpsita แจ้งให้เราทราบหากคุณมีปัญหานี้หรือไม่ ฉันแค่ซ่อมมัน :)
อึ๊ง

10

วิธีแก้ปัญหาเหล่านี้ไม่เหมาะกับฉัน บางหน้าดูเหมือนว่าจะเข้าสู่ระบบ แต่คนอื่นจะไม่ ดูเหมือนว่านี่เป็นข้อผิดพลาด:

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

ฉันสิ้นสุดการสร้างผู้ช่วยที่ฉันสามารถโทรหาในเทมเพลตของฉัน:

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

จากนั้นฉันสามารถใช้ตัวช่วยในเทมเพลตได้เช่น:

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

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

นั่นเป็นจริงรหัสเดียวที่ทำงานกับฉันเป็นของคุณ ขอขอบคุณ!
George George

ฉันจะโทร->getCustomer()->getName()โดยใช้บริบทได้อย่างไรเพราะถ้าฉันใช้เซสชันไม่ทำงานสำหรับทุกหน้า
George George

หากเปิดใช้งานแคชเต็มหน้านี่เป็นคำตอบที่ถูกต้อง คุณสามารถตรวจสอบลูกค้าก่อนและถ้ามันกลับเท็จคุณสามารถทำได้
CompactCode

9

หากต้องการให้ผู้ใช้ลงชื่อเข้าใช้ที่แม่แบบคุณสามารถโทรหาผู้ช่วยได้ในบรรทัดเดียวเพียงบรรทัดเดียว:

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

<?php if( $_loggedin ) : ?>

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

<?php endif; ?>

ทางออกที่ดีโดยไม่ใช้ objectmanager
Nitesh

2
สิ่งนี้ไม่ทำงานใน v2.1.5 เมื่อเปิดใช้งาน FPC และวานิชในโหมดการผลิต
thdoan

8

ไม่มีวิธีแก้ปัญหาใดสำหรับฉันที่เชื่อถือได้ใน Magento v2.1 ที่เปิดใช้งานแคชแบบเต็มหน้าและสารเคลือบเงาในโหมดการผลิต ในที่สุดผมก็พบวิธีแก้ปัญหาที่ทำงาน 100% vendor/magento/module-theme/view/frontend/templates/html/header.phtmlของเวลาที่มีการแคชทั้งหมดที่เปิดใช้หลังจากที่ได้รับความคิดจาก นี่คือโซลูชันของฉันซึ่งแสดงลิงก์ "ลงชื่อเข้าใช้" เมื่อผู้ใช้ออกจากระบบและลิงก์ "ลงชื่อออก" เมื่อผู้ใช้ลงชื่อเข้าใช้:

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

UPDATE: ตั้งแต่ v2.1.5 โซลูชันนี้ไม่น่าเชื่อถืออีกต่อไป ดูที่ปัญหา 9156สำหรับวิธีแก้ไข


มันเป็นทางออกที่ดี แม้ว่าคุณสามารถใช้ cachable = "false" ในไฟล์เลย์เอาต์
Dinesh Yadav

ฉันมีcachable="false"XML ในโครงร่างสำหรับบล็อกนี้ แต่วานิชยังคงแคชอยู่อย่างเห็นได้ชัด ไม่แน่ใจว่านี่เป็นข้อผิดพลาดหรือไม่ แต่การทำให้ล้มลงเป็นวิธีที่ดีในการหลีกเลี่ยงสิ่งนี้ ข้อเสียเพียงอย่างเดียวคือมีความล่าช้าเล็กน้อยก่อนที่ลิงก์ลงชื่อเข้า / ออกจะปรากฏขึ้นเนื่องจากมีผลผูกพัน KO
thdoan

6

มีคำตอบมากมายที่ออกมาเป็นแบบนี้ ...

รับผู้จัดการโหลดวัตถุขึ้นชั้นรุ่นทำสิ่ง

นี่เป็นวิธีการที่ผิดที่ใช้ใน Magento2.0 ใน 2.0 โรงงานสร้างวัตถุอัตโนมัติเป็นวิธีที่จะไป คุณสามารถฉีดเข้าไปในตัวสร้างของคุณในเกือบทุกชั้นเรียนและใช้พวกเขา ตัวอย่าง:

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
\Magento\Customer\Model\SessionFactory $sessionFactoryถ้าคุณได้รับข้อผิดพลาดสำหรับโรงงานจากนั้นใช้เส้นทางแบบเต็มเช่น
thdoan

แก้ไข. ฉันมักจะประกาศพวกเขาที่ด้านบนเพียงเพื่อให้วิธีการของฉันดูไม่เป็นระเบียบมาก :)
CarComp

3

สวัสดีได้รับคำตอบที่นี่:

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

แหล่ง

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

แทนที่ด้วย get ด้วย create ตอนนี้ทำงานได้ดี:

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

4
คุณไม่ควรใช้ObjectManagerโดยตรง
7ochem

สิ่งนี้ใช้ได้เฉพาะเมื่อปิดการใช้งานแคชไม่ได้อยู่ใน enabled-cache
ใจ

@ ใจนี้ทำงานให้ฉันในการพัฒนาและการผลิตเช่นกัน คุณช่วยส่งขั้นตอนในการทบทวนปัญหาให้ฉันได้ไหม
Manish

ฉันต้องตรวจสอบว่าผู้ใช้เข้าสู่ระบบหรือไม่ แต่รหัสด้านล่างใช้งานได้เฉพาะในแคชที่ปิดใช้งาน $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ customerSession = $ objectManager-> create ('Magento \ Customer \ Model \ Session'); if ($ customerSession-> isLoggedIn ()) {// CODE}
Jai

เมื่อเปิดใช้งานแคช: ใช้ได้เฉพาะกับหน้าแดชบอร์ดที่กำหนดเองซึ่งไม่ได้อยู่ในหน้าแรกและหน้าอื่น ๆ ของไซต์ คำถามของฉัน: magento.stackexchange.com/q/177964/29175
Jai

3

นี่เป็นหนึ่งในโซลูชัน "ตรวจสอบว่าลูกค้าลงชื่อเข้าใช้หรือไม่อยู่ใน Magento2"

ลองรหัสด้านล่าง:

 $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

ลองรหัสด้านล่าง:

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

สำหรับการใช้รหัสข้างต้นในไฟล์ phtml คุณสามารถเรียกใช้ isLoggedIn () ฟังก์ชั่นเป็น:

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

หวังว่าความช่วยเหลือนี้ขอบคุณ


สวัสดี @Shubdham มันไม่ทำงาน ..
jafar pinjar

นี่เป็นทางออกที่เรียบร้อย ขอบคุณ
ถาม Bytes

ใช่ขอบคุณหวังว่ามันจะช่วยคุณ
Shubham Khandelwal

2

ฉันได้รับทางออกที่ดีที่สุดแล้ว มันขึ้นอยู่กับการตรวจสอบของลูกค้า เซสชันลูกค้าบางรายไม่ทำงาน แต่ทุกครั้งที่โซลูชันของฉันใช้งานได้ ให้ดู

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

ขอบคุณ


1

โซลูชันที่ทำงานปัจจุบัน (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

หากคุณต้องการตรวจสอบลูกค้าที่เข้าสู่ระบบหรือไม่ใช้รหัสนี้ในไฟล์ 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
คุณไม่ควรใช้ObjectManagerโดยตรงและไม่ควรใช้รหัสประเภทนี้ในแม่แบบ คุณควรสร้างฟังก์ชันการทำงานในคลาสบล็อกของคุณเพื่อจัดการสิ่งนี้
7ochem

เมื่อคุณรู้วิธีการทำอย่างถูกต้องแล้วคุณจะสงสัยว่าคุณจะทำอย่างอื่นได้อย่างไร!
CarComp

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

if($customerSession->isLoggedIn()) {

}

0

คำตอบอื่น:

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

คุณคิดอย่างไร?


0

การดึงสถานะที่บันทึกจากรุ่นเซสชันจะไม่ทำงานในกรณีที่คุณต้องการใช้หลังจากเปิดใช้งานแคช FPC ที่เป็นค่าเริ่มต้นของ Magento ในกรณีนั้นคุณควรใช้ SessionFactory แทน

เซสชันไม่ได้เริ่มต้นหากเปิดใช้งานการแคช FPC รายละเอียด: https://github.com/magento/magento2/issues/3294#issuecomment-328464943

เพื่อแก้ปัญหานี้คุณต้องใช้SessionFactoryตัวอย่างเช่น:

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

ฉันลองหลายวิธีที่พบใน google แต่วิธีการแก้ปัญหาไม่ทำงาน ดังนั้นฉันจะตรวจสอบฟังก์ชั่นหลักและสร้างไฟล์ php เพื่อตรวจสอบว่าลูกค้าล็อกอินหรือไม่โดยไม่ใช้ Object Manager


            / **
         * เซสชันลูกค้า
         * โมดูลที่สร้างขึ้นโดยรหัสเทคโนโลยีเว็บ
         * พัฒนาโดย Vinay Sikarwar
         * @var \ Magento \ Framework \ App \ Http \ บริบท
         * /
        ป้องกัน $ session;

        / **
         * ตัวสร้างการลงทะเบียน
         * @param บริบท $ บริบท
         * @param array $ data
         * /
        ฟังก์ชั่นสาธารณะ __ โครงสร้าง (
            บริบท $ บริบท
                    \ Magento \ Framework \ Session \ Generic $ session
            ข้อมูล $ array
        )
        {
                    $ this -> _ session = $ session;
                    parent :: __ สร้าง ($ context, $ data);
        }

            / **
         * ตรวจสอบสถานะการเข้าสู่ระบบของลูกค้า
         * * * *
         * @api
         * @ ย้อนกลับบูล
         * /
        ฟังก์ชั่นที่สาธารณะ isCustomerLoggedIn ()
        {
            ส่งคืน (บูล) $ this-> getCustomerId ()
                && $ $-> checkCustomerId ($ this-> getId ())
                &&! $ this-> getIsCustomerEmulated ();
        }
    }

สำหรับข้อมูลเพิ่มเติมตรวจสอบได้ที่นี่http://blog.webtechnologycodes.com/customer-loggedin-check-magento2

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.