Magento getSingleton混乱

时间:2011-11-08 11:19:14

标签: magento

我对Mage::getSingleton看到的电话有点困惑,我希望有人可以帮我理解一点。

我已经看到了一段核心代码:

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

我不知道PHP,但我想我可以从 getSingleton 方法名称做出一个安全的假设,即只有一个类的实例被指定(该类被指定为分组类名,并解析为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个实例,当我们没有告诉客户我们在谈论什么客户时,我们如何询问单个客户是否已登录?

问题3 -

我看到了对Mage::getSingleton('core/session')Mage::getSingleton('customer/session')的来电 - 有什么区别?

感谢您的帮助。

2 个答案:

答案 0 :(得分:99)

首先,在我们访问Magento之前,了解PHP与Java有着截然不同的流程模型非常重要。 PHP单例(不管Magento的参与)是一个类每个HTTP请求的单个实例。 PHP程序在内存中的持久性与Java程序的持久性不同,因此相应地调整对“单例”的期望。

接下来,重要的是要了解Magento是一个使用PHP构建在PHP 之上的框架,并且在许多情况下,原始的Magento开发人员希望将事物推向更像Java的体系结构。所以,你会看到看起来熟悉,熟悉的东西,但可能与你习惯的东西有所不同,因为他们仍然需要知道PHP的宇宙版本。

Magento使用工厂模式来实例化Helpers,Blocks和“Model”类。字符串

core/session

是一个类别名。此别名用于在Magento的配置中查找类名。简而言之,此字符串将转换为路径表达式,用于搜索Magento的配置文件,以根据调用它的上下文(帮助程序,块,模型)派生类名。对于较长的版本,请参阅我的Magento's Class Instantiation Autoload文章。

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

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

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会话通过向最终用户程序员公开超级全局$ _SESSION数组来工作,该数组允许以每个Web用户为基础存储信息。通过在用户端将唯一ID设置为cookie,然后将该cookie用作查找键(也是Web应用程序的标准做法)来实现会话

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

core/session
customer/session

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

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

答案 1 :(得分:11)

  1. Magento的getSingleton与getModel几乎相同。区别在于getModel总是返回一个类的新实例,而getSingleton只创建一个类的新实例,然后始终返回此实例。请参阅Mage::getSingletonMage::getModel方法。 由于config.xml文件(f.e. Mage/Customer/etc/config.xml)中的配置,Magento知道要查看Model文件夹。请参阅Magento wiki for developers以了解有关配置文件的更多信息。

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

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