我对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')
的来电 - 有什么区别?
感谢您的帮助。
答案 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)
Magento的getSingleton与getModel几乎相同。区别在于getModel总是返回一个类的新实例,而getSingleton只创建一个类的新实例,然后始终返回此实例。请参阅Mage::getSingleton
和Mage::getModel
方法。
由于config.xml
文件(f.e. Mage/Customer/etc/config.xml
)中的配置,Magento知道要查看Model文件夹。请参阅Magento wiki for developers以了解有关配置文件的更多信息。
您没有直接指定客户。它由Magento在Mage_Customer_Model_Session
的父类中自动完成(参见Mage_Core_Model_Session_Abstract_Varien::start()
方法)
Magento没有一个会话类来区分会话数据。例如,客户ID存储在Mage_Customer_Model_Session
中,错误消息“产品不可用”将存储在Mage_Catalog_Model_Session
类中。