Magento getSingleton混淆

我对Mage::getSingleton电话有些困惑,我希望有人能帮助我更好地理解。

我已经看到了这样一个核心代码:

 Mage::getSingleton('customer/session')->isLoggedIn() 

我不知道PHP,但我想我可以从getSingleton方法名称做一个安全的假设,将只有一个指定的类的实例(该类被指定为一个分组的类名称,并parsing为app/code/core/Mage/Customer/Model/Session.php – 包含Mage_Customer_Model_Session类。

问题1

getSingleton方法如何知道要在类的Model文件夹中查找?

问题2

所以有一个整体类的实例…我想说JVM,因为我来自Java背景,但是我会说PHP引擎,希望这是隐含的正确的术语; Mage_Customer_Model_Session不传入客户ID或任何这样的标识符,但是我们调用方法isLoggedIn() ! 给每个客户没有Mage_Customer_Model_Session实例,当我们不告诉客户我们正在谈论的是什么客户时,我们怎么能问一个客户是否login?

问题3

我见过对Mage::getSingleton('core/session')Mage::getSingleton('customer/session') – 有什么区别?

感谢您的任何帮助。

首先,在我们到达Magento之前,了解PHP具有与Java完全不同的stream程模型是很重要的。 一个PHP单例(不pipeMagento的参与)是每个HTTP请求的一个类的单个实例。 一个PHP程序不像Java程序那样在内存中持久化,所以要相应地调整你对“单例”的期望。

接下来,理解Magento是一个使用PHP构build PHP 之上的框架是很重要的,在很多情况下,原始的Magento开发者希望将这些东西推向更类似于Java的架构。 所以,你会看到看起来很熟悉,熟悉的东西,但是可能与你习惯的方式有很大的不同,因为他们仍然需要去PHP的宇宙版本。

Magento使用工厂模式实例化Helpers,Blocks和“Model”类。 string

 core/session 

是一个类的别名。 这个别名用于查找Magentoconfiguration中的类名。 简而言之,这个string被转换成pathexpression式来searchMagento的configuration文件,根据它被调用的上下文(helper,block,model)派生一个类名。对于更长的版本,请参阅我的Magento的类实例化Autoload文章。

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

实例化模型类有两种方法。

 Mage::getModel('groupname/classname'); Mage::getSingleton('groupname/classname'); 

第一种forms会给你一个新的类实例。 第二种forms会得到你一个单例类实例。 这个特定的Magento抽象允许你从任何 Magento模型类创build一个单例,但只有当你坚持使用Magento的实例化方法。 也就是说,如果你打电话

 Mage::getSingleton('groupname/classname'); 

然后再打电话给

 Mage::getSingleton('groupname/classname'); 

将返回该单例实例。 (这是用registry模式实现的)。 但是,没有任何东西阻止你直接实例化类的新实例

 $o = Mage::getModel('groupname/classname'); $o = new Mage_Groupname_Model_Classname(); 

这给我们带来了会议。 PHP的请求模型,如HTTP,最初devise为无状态。 每个请求都会随着用户的信息进入系统。 随着语言(和networking)向着一个应用程序平台的方向发展,引入了一个允许信息被持久化的系统来取代正在出现的自主开发的系统。 这个系统被称为会话。 PHP会话通过向最终用户程序员公开一个超级全局$ _SESSION数组来实现,该数组允许信息以每个Web用户的身份存储。 会话是通过在用户端设置唯一ID作为cookie来实现的,然后将该cookie用作查找键(也是web应用程序的标准实践)

反过来,Magento系统在PHP的会话抽象之上build立一个抽象。 在Magento中,您可以创build一个“会话模型”,从基础会话类inheritance,在其上设置数据成员,并像数据库持久性模型一样保存/加载这些数据成员。 所不同的是信息存储在会话中而不是数据库存储中。 当你看到

 core/session customer/session 

这是两个不同的会话模型,每个模型存储不同的数据。 一个属于Mage_Core模块,另一个属于Mage_Customer模型。 这个系统允许模块安全地设置和操作他们自己的会话数据,而不会意外地踩到另一个模块的脚趾,并提供逻辑类方法来处理这些数据。

希望能回答你提出的问题,以及你没有的问题。

  1. Magento的getSingleton与getModel几乎相同。 不同之处在于getModel总是返回一个新的类实例,getSingleton只创build一个类的新实例,然后总是返回这个实例。 参见Mage::getSingletonMage::getModel方法。 Magento知道如何查找Model文件夹,因为config.xml文件中的configuration文件(fe Mage/Customer/etc/config.xml )。 查看Magento wiki让开发人员了解更多关于configuration文件。

  2. 您不直接指定客户。 它由Magento在Mage_Customer_Model_Session父类中自动完成(参见Mage_Core_Model_Session_Abstract_Varien::start()方法)

  3. Magento没有一个会话类来区分会话数据。 例如,客户ID存储在Mage_Customer_Model_Session ,错误消息“产品不可用”将存储在Mage_Catalog_Model_Session类中。