Magento PHP 检查用户是否已登录

3
我有以下代码来检查用户是否已登录。它在客户区域内有效(用户已登录),但在客户区域外部无效,即使客户仍然已登录。
<?php
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$customerSession = $objectManager->get('Magento\Customer\Model\Session');
if($customerSession->isLoggedIn()) { ?>
   <li class="link wishlist" data-bind="scope: 'wishlist'">
    <a <?php /* @escapeNotVerified */ echo $block->getLinkAttributes() ?>><?php echo $block->escapeHtml($block->getLabel()) ?>
        <!-- ko if: wishlist().counter -->
        <span data-bind="text: wishlist().counter" class="counter qty"></span>
        <!-- /ko -->
    </a>
</li>
<li>Hello World</li>
?>
<?php
}
else {
?>
    <li>Not logged in</li>
<?php
}
?>



<script type="text/x-magento-init">
    {
        "*": {
            "Magento_Ui/js/core/app": {
                "components": {
                    "wishlist": {
                        "component": "Magento_Wishlist/js/view/wishlist"
                    }
                }
            }
        }
    }
</script>

2
哪个版本的Magento? - Martin
7个回答

7
在 Magento 1.9 中,如果您想要在任何控制器或 phtml 文件中检查用户是否已登录,则需要添加以下代码:
<?php 
    if( ! Mage::getSingleton('customer/session')->isLoggedIn()){
        //not logged in
    }else{
        // logged in
    }
?>

实例化超级对象的重要部分是这个:
 Mage::getSingleton('customer/session')

2
看一下他正在使用的代码。这是Magento 2,而不是Magento 1.9。虽然他应该明确说明。 - user3478148

2

如果你要在Magento 2.x的phtml文件中检查用户是否已登录,可以使用以下代码:

在PHP中实现的"最初的回答"如下:

     $authorizationLink = $block->getLayout()->createBlock('Magento\Customer\Block\Account\AuthorizationLink');

    <?php if($authorizationLink->isLoggedIn()){
        // Customer is logged In
     }else{
        // Customer is not logged In
    } 
?>

不确定为什么,但在2.3.5中会话不起作用,而这种方式可以正常工作。 - open-ecommerce.org

1

这是因为echo $block->getLinkAttributes()

这个块是在vendor\magento\framework\View\Element\Html\Link.php中,它并不在每个页面上都被称为$block,所以如果你需要getLinkAttributes(),你需要手动调用它。


0
使用以下代码来检查用户是否已登录:
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$customerSession = $objectManager->get('Magento\Customer\Model\Session');

if($customerSession->isLoggedIn()) 
{
 // your code
}

可以确认这个适用于Magento 2.1:非常完美,谢谢。 - Ahdee
不应使用objectManager。 - Black

0

检查客户是否在整个网站中已登录

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

     if($isLoggedIn == 1){
     //Customer is Logged In
     }

如何在这个类中获取客户名称。 - jafar pinjar
objectManager 是一种不好的方式。 - Black

0

你不应该听取所有用户建议使用objectManager。这是不规范且性能较低的方法。并且,你应该始终将逻辑代码放在块类中,而不是在模板中编写。一定要将业务逻辑与视图分离。

正确的方式:

例如,在块类\Magento\Checkout\Block\Cart\Sidebar中,我添加了一个名为“isUserLoggedIn()”的新方法。

首先,我使用自己的Custom\Module\Block\Cart\Sidebar扩展了该类。

<?php

namespace Custom\Module\Block\Cart;

class Sidebar extends \Magento\Checkout\Block\Cart\Sidebar
{
    private $customerSession;
    ...

    public function __construct(
        \Magento\Checkout\Model\Session $checkoutSession,   
        ...
    ) {

        $this->customerSession = $customerSession;
        ...
    }

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

现在你可以在模板中使用$block->isLoggedIn()了。


-1
请使用以下代码解决您的问题。
<?php
$objectManagerlogin = \Magento\Framework\App\ObjectManager::getInstance();
$customerSession = $objectManagerlogin->get('Magento\Customer\Model\Session');
$baseurl = $objectManagerlogin->get('Magento\Store\Model\StoreManagerInterface')->getStore(0)->getBaseUrl();
?>
<?php if($customerSession->isLoggedIn()) { ?>
  <a href="<?php echo $baseurl .'customer/account/logout'; ?>">LOGOUT</a>
<?php }else { ?>
<a href="<?php echo $baseurl .'customer/account/login'; ?>">LOGIN</a>    
<?php
}
?>

那很糟糕,你永远不应该使用objectManager。你必须在块类中添加代码,然后只需在模板中调用它。 - Black

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接