顧客がmagento 2にログインしているかどうかを確認する方法


64

ユーザーがMagento 2にログインしているかどうかを確認する方法

顧客がログインしている場合、セッションから顧客データを取得する方法は?


ここで言及した解決策はどれも私にとってはうまくいきませんでした。@Rakesh:それがどのように機能したのか教えてください。
イプシタラウト

Magento JSモジュール内からログイン状態を確認する必要がある場合(text/x-magento-init)、ObjectManagerのインスタンス化を回避し、ステータスをモジュールの構成オブジェクトに渡すことでオーバーヘッドを節約でき、代わりにログインリンクを照会できることに注意してくださいJSモジュール内、たとえば:var isLoggedIn = $('.authorization-link > a').attr('href').indexOf('/login')<0;
thdoan

@Rakesh、クール、これらを確認してください、magento.stackexchange.com / questions / 185994 /…、、magento.stackexchange.com
questions /

1
以下の行は何をしていますか?var isLoggedIn = $( '。authorization-link> a')。attr( 'href')。indexOf( '/ login')<0;
ハイサ

リンクをチェック、rakeshjesadiya.com /…
Rakesh Jesadiya

回答:


62

次のコードを使用すると、顧客のログインを確認できます

$ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance();
$ customerSession = $ objectManager-> get( 'Magento \ Customer \ Model \ Session');
if($ customerSession-> isLoggedIn()){
   //顧客ログインアクション
}

コントローラーから

$ this-> _ objectManager-> get( 'Magento \ Customer \ Model \ Session');
if($ customerSession-> isLoggedIn()){
   //顧客ログインアクション
}

1
もちろん、それは最も明白な解決策であり、私は初めてそれを使用しましたが、顧客セッションがまだ初期化されていない場合は正しく機能しないことに気づいたので、あまり明白ではないがより持続可能な解決策を見つけました。
Mage2.PRO

11
objectmanagerを直接使用しないでください。セッションモデルのObjectFactory生成コードを挿入するだけです。
CarComp

6
回答に他の回答をコピーしないでください。
マリウス

6
これは「間違った」方法です。デジタルピアニズムのラファエルからの答えは正解です
ロレンツォ

1
全ページキャッシュを有効にし、これをブロック/テンプレートで呼び出すと、顧客セッションが常に空を返すため、機能しません。代わりに、httpコンテキストを使用して確認してください。
レオ

84

重要なお知らせ:オブジェクトマネージャーを直接呼び出さないでください

したがって、ここでそれをきれいに行う方法です

テンプレートを除くすべてのクラス

まず、コンストラクターに次のクラスを挿入する必要があります/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" />

次に、カスタムブロックコントラクタで、任意のクラス(上記で説明)と同じ依存性注入に従う必要があります。

ここでの追加手順は、テンプレートで使用できるパブリックメソッドを作成して、顧客がログインしているかどうかを確認することです。

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\TemplateVendor\Module\Block\Your\Custom\Block
アンドレア

@Andreaはよく依存し、それぞれの場合で異なります。私は私の答えで、一般的なクラスパス名を使用する理由です
デジタルPianismでラファエル

class Html extends \Magento\Framework\View\Element\Templateコンストラクターでセッションオブジェクトを挿入できる場所として定義されたカスタムブロックがあります。私はこの方法で(レイアウトxmlファイルから)カスタムテーマ内でこのブロックを使用します<block class="Vendor\ThemeName\Block\Html" template="Vendor_ModuleName::html/my-custom-template.phtml"/>。テンプレートファイル内のログに記録されたユーザーをチェックしたいですmy-custom-template.phtml。`<preference ... />タグの使用方法
アンドレア

-> isLoggedin()メソッドでは機能しません。理由はわかりませんが、顧客がログインしていることを返すことはありません。ログインしています(ログインしています)。
ウラジミールDespotovic

@VladimirDespotovicは別の方法をテストしましたか?
デジタルピアニズムのラファエル

31

Magento\Framework\App\Http\Contextまたはを介して可能Magento\Customer\Model\Sessionです。ただし、結果は異なる場合があります。

  • HTTPコンテキストは顧客セッションよりも早く初期化されます(ただし、両方ともアクションコントローラーで初期化されるため問題ではありません)
  • PageCacheモジュールがオンの場合(おそらく常に本番稼働)、レイアウト生成が開始されるとすぐに、\Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXmlすべてのキャッシュ可能なページでカスタマーセッションがクリアされることに注意してください。つまり、顧客がHTTPコンテキストを介してログインしているかどうかを確認した場合、「yes」と表示されますが、顧客セッションでは顧客データを使用できなくなります。そのため、顧客セッションでデータにアクセスする前に、二重チェックが必要です。これはブロック内で簡単に発生する可能性がありますが、アクションコントローラーではレイアウトを手動で生成することは想定されていないため、アクションコントローラーでは発生しません。アクションコントローラーがインスタンスを返した後に生成されますResultInterface

PageCacheがオンのときに記述された不整合のリスクを排除するために、すでに初期化されている場合(アクションコントローラーの場合はtrue)、カスタマーセッションの使用を検討してください。それ以外の場合は、HTTPコンテキストを使用します。


PageCacheの有効化のヒント、thx
LucScu

3
@Alex私は以下のコードを使用しています$ customerSession = $ objectManager-> get( 'Magento \ Framework \ App \ Http \ Context'); $ isLoggedIn = $ customerSession-> getValue(\ Magento \ Customer \ Model \ Context :: CONTEXT_AUTH); ただし、キャッシュにより、ログインした顧客にサインアウトする代わりにサインインオプションが表示されます。どうすれば修正できますか?
ニテシュ

これは私たちを苦しめた、ありがとう。あなたの答えにはもっと注意が必要です:-)本番環境でキャッシュを有効にすると、セッションが難しくなります。カスタムmagentoプラグインを作成している場合、ルートのXMLファイルにcachable = falseを配置します。
リゲマー

2
なぜキャッシュ可能= 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へのログインはどのようになりますか?
xanka

8
ObjectManagerを直接使用しないでください
-7ochem

はい、同意しました。Objectmanagerを使用する方法ではありません。クラスコンストラクターにCustomerFactoryを注入します。
CarComp

上記の解決策は私にとっては
うまくいき

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

それは本当です、私で働いた唯一のコードはあなたのものです。ありがとうございました!
ジョージジョージ

->getCustomer()->getName()セッションを使用するとすべてのページで機能しないため、コンテキストを使用してどのように呼び出すことができますか?
ジョージジョージ

全ページキャッシュが有効になっている場合、これが正しい答えです。最初にcustomersessionを確認し、それがfalseを返す場合、これを行うことができます
CompactCode

9

ユーザーをテンプレートにログインさせるには、たった1行でヘルパーを呼び出すだけです。

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

<?php if( $_loggedin ) : ?>

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

<?php endif; ?>

objectmanagerを使用しない素晴らしいソリューション。
Nitesh

2
これは、FPCおよびVarnishがプロダクションモードで有効になっているv2.1.5では機能しませんでした。
-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>

更新:v2.1.5以降、このソリューションは信頼できなくなりました。解決策については、問題9156を参照してください。


それは良い解決策です。ただし、レイアウトファイルではcachable = "false"を使用できます。
ディネシュヤダブ

私はcachable="false"このブロックのレイアウトXML を持っていますが、ニスは明らかにそれをキャッシュしています。これがバグかどうかはわかりませんが、Knockoutはこれを回避する良い方法です。唯一の欠点は、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でキャッシュが無効になっている場合にのみ機能します。
ジャイ

@Jai、これは私にとっても開発と生産の仕事です。問題を再現する手順を送ってください。
マニッシュ

ユーザーがログインしているかどうかを確認する必要があります。ただし、以下のコードは無効なキャッシュでのみ機能します$ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance(); $ customerSession = $ objectManager-> create( 'Magento \ Customer \ Model \ Session'); if($ customerSession-> isLoggedIn()){//コード}
ジェイ

キャッシュを有効にする:ホームページやサイトの他のページではなく、カスタムダッシュボードページでのみ機能します。私の質問:magento.stackexchange.com/q/177964/29175
ジャイ

3

これは、「顧客がMagento2にログインしているかどうかを確認する」という解決策の1つでもあります。

以下のコードを試してください:

 $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

これはきちんとしたソリューションです。おかげで
バイトを尋ねる

ええ、ありがとう。
シューハムハンデルヴァル

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

MagentoのデフォルトのFPCキャッシュを有効にした後、セッションモデルからログステータスを取得しても機能しません。その場合は、代わりに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

私はグーグルで見つかった多くの方法を試しましたが、解決策のどれも動作しません。だから私はコア機能をチェックし、顧客がオブジェクトマネージャを使用せずにログインしているかどうかをチェックするPHPファイルを作成しました。


            / **
         *顧客セッション
         * Web Technology Codesによって作成されたモジュール
         * Vinay Sikarwarにより開発
         * @var \ Magento \ Framework \ App \ Http \ Context
         * /
        保護された$ session;

        / **
         *登録コンストラクター。
         * @param Context $ context
         * @param array $ data
         * /
        パブリック関数__construct(
            コンテキスト$ context、
                    \ Magento \ Framework \ Session \ Generic $ session、
            配列$ data
        )
        {
                    $ this-> _ session = $ session;
                    parent :: __ construct($ context、$ data);
        }

            / **
         *顧客のログインステータスの確認
         *
         * @api
         * @return bool
         * /
        パブリック関数isCustomerLoggedIn()
        {
            return(bool)$ this-> getCustomerId()
                && $ this-> checkCustomerId($ this-> getId())
                &&!$ this-> getIsCustomerEmulated();
        }
    }

詳細については、http://blog.webtechnologycodes.com/customer-loggedin-check-magento2をご覧ください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.