Magento getSingleton混淆

Magento getSingleton混淆,magento,Magento,对于我看到的调用Mage::getSingleton,我有点困惑,我希望有人能帮助我更好地理解 我看到了一段核心代码,它可以做到这一点: Mage::getSingleton('customer/session')->isLoggedIn() 我不懂PHP,但我想我可以从getSingleton方法名中做出一个安全的假设,即指定的类只有一个实例(将类指定为分组类名,并解析为app/code/core/Mage/Customer/Model/Session.php——包含类Mage\u C

对于我看到的调用
Mage::getSingleton
,我有点困惑,我希望有人能帮助我更好地理解

我看到了一段核心代码,它可以做到这一点:

Mage::getSingleton('customer/session')->isLoggedIn()
我不懂PHP,但我想我可以从getSingleton方法名中做出一个安全的假设,即指定的类只有一个实例(将类指定为分组类名,并解析为
app/code/core/Mage/Customer/Model/Session.php
——包含类
Mage\u Customer\u Model\u Session

问题1-

getSingleton方法如何知道在模型文件夹中查找类

问题2-

因此,整个类只有一个实例……我想说JVM,因为我来自Java背景,但我会说PHP引擎,希望这是一个模糊的正确术语;
Mage\u Customer\u Model\u Session
没有传入客户id或任何这样的标识符,但我们调用方法
isLoggedIn()
!如果每个客户都没有
Mage\u Customer\u Model\u会话
实例,那么当我们不告诉单身人士我们在谈论什么客户时,我们如何询问他们是否已登录

问题3-

我看到过对
Mage::getSingleton('core/session')
Mage::getSingleton('customer/session')
的调用-有什么区别

谢谢你的帮助

  • Magento的getSingleton与getModel几乎相同。不同之处在于getModel始终返回类的新实例,而getSingleton只创建一次类的新实例,然后始终返回该实例。请参阅
    Mage::getSingleton
    Mage::getModel
    方法。 由于
    config.xml
    文件(f.e.
    Mage/Customer/etc/config.xml
    )中的配置,Magento知道如何查找模型文件夹。有关配置文件的详细信息,请参阅

  • 您不直接指定客户。它由Magento在
    Mage\u customer\u Model\u Session
    的父类中自动完成(请参见
    Mage\u Core\u Model\u Session\u Abstract\u Varien::start()
    方法)

  • Magento没有一个会话类来区分会话数据。例如,客户ID存储在
    Mage\u customer\u Model\u会话
    中,错误闪烁消息“Product is not available”(产品不可用)将存储在
    Mage\u Catalog\u Model\u会话
    类中


  • 首先,在我们讨论Magento之前,必须了解PHP的流程模型与Java完全不同。PHP单例(无论Magento是否参与)是每个HTTP请求的类的单个实例。PHP程序在内存中的持久性与Java程序不同,因此相应地调整您对“单例”的期望

    接下来,重要的是要了解Magento是一个构建在PHP之上的框架,使用PHP,在许多情况下,Magento的原始开发人员希望将东西推向一个更像Java的架构。因此,您将看到一些看起来很熟悉、很熟悉的东西,但可能与您使用的东西在某些主要方面有所不同因为他们仍然需要使用PHP版本的宇宙

    Magento使用工厂模式实例化帮助程序、块和“模型”类

    core/session
    
    是类别名。此别名用于查找Magento配置中的类名。简言之,此字符串将转换为路径表达式,用于搜索Magento的配置文件,以根据调用它的上下文(帮助程序、块、模型)派生类名。有关更长的版本,请参阅我的文章

    “模型”的概念在Magento中有点模糊。在某些情况下,模型被用作域或服务模型。在其他情况下,它们被用作更传统的中间件数据库持久性模型。在使用该系统几年后,我认为考虑模型最安全的方式是Magento尝试取消直接类实例化n

    实例化模型类有两种方法

    Mage::getModel('groupname/classname');
    Mage::getSingleton('groupname/classname');
    
    第一种形式将为您提供一个新的类实例。第二种形式将为您提供一个单例类实例。此特定的Magento抽象允许您从任何Magento模型类中创建一个单例,但前提是您坚持使用Magento的实例化方法。也就是说,如果您调用

    Mage::getSingleton('groupname/classname');
    
    然后再打电话给

    Mage::getSingleton('groupname/classname');
    
    将返回该单例实例。(这是使用注册表模式实现的)。但是,没有任何东西可以阻止您使用

    $o = Mage::getModel('groupname/classname');
    $o = new Mage_Groupname_Model_Classname();
    
    这就引出了会话。PHP的请求模型,如HTTP,最初设计为无状态。每个请求进入系统时都带有,并且只有来自用户的信息。作为语言(和web)为了成为一个应用程序平台,引入了一个允许信息持久化的系统,以取代突然出现的国产系统。该系统称为会话。PHP会话通过向最终用户程序员公开一个超级全局$\u会话数组来工作,允许信息存储在每个web用户的bas上会话是通过在用户端将唯一ID设置为cookie,然后将该cookie用作查找键来实现的(也是web应用程序的标准实践)

    反过来,Magento系统在PHP的会话抽象之上构建一个抽象。在Magento中,您可以创建一个“会话模型”它继承自基类会话,在基类会话上设置数据成员,并像使用数据库持久性模型一样保存/加载这些数据成员。区别在于信息存储在会话中,而不是数据库存储中。当您看到

    core/session
    customer/session
    
    这是两种不同的会话模型,每种模型存储不同的数据