了解Magento注册表


13

我一直想知道,所有注册表数据都存储在Magento中吗?

我知道,即使单例对象也存储在注册表中。注册表只是Mage类的静态数组变量。

我有几个问题可以消除我的困惑:

  1. 注册表对于不同的用户是否有所不同?我的意思是它是基于每个用户(每个HTTP请求)创建的吗?

例如,

Mage::register('foo', 'Hello World'); //set a value for foo
Mage::registry('foo'); //will this return hello world for all HTTP users ?
  1. 注册表数据是否存储在会话中?如果不是,Magento将如何识别哪个用户调用了注册表数据?

我已经阅读了Alan Storm的博客文章,以及他在StackOverFlow上对此的回答。但是我无法消除混乱。如果我认为我的基础知识搞砸了,请纠正我。谢谢




感谢阿米特·贝拉(Amit Bera),在发布此问题之前,我正在阅读艾伦(Alan)的文章和SOF回答。我不能完全从那里得到答案。
Hashid 2014年

Answers:


23

注册表将数据存储到特定于该请求(而不是用户或其他任何内容)的内存,并且仅在该请求期间保持不变。原理确实非常简单,Mage该类被实例化为每个请求的单例对象,并且实例化的Mage对象保留在内存中,并且在所有类(和模板)中都可以访问,直到请求完成并发送响应为止。

由于对象是单例对象,因此只要您访问它,您都会得到相同的对象。发生的所有事情就是您正在将值存储到该对象,因此,当一个类存储一个值,而另一个类访问它时,它们都在同一个对象上工作,第二个类可以检索第一个类集的值。


1
因此,它仅对一个请求有效吗?这意味着如果我在Magento中加载页面,则一个请求已完成并且注册表数据已刷新?
Hashid 2014年

4
是,您设置的值Mage::register()仅适用于该请求。如果要存储用户特定的数据,则应使用该会话,注册表实际上只是旨在使数据在类之间可移植。
乔纳森·侯赛

1
那讲得通!同样适用于单例实例吗?
Hashid 2014年

1
是的,完全一样-如果您查看类的getSingleton()方法,则Mage它实际上会将数据存储到注册表中。
乔纳森·侯赛


2

Magento注册表存储在应用程序的内存中

每当脚本运行完毕后,您存储在注册表中的所有内容都将消失,因此无需担心将其清除(除非您正在运行的脚本将大型对象存储在注册表中并循环遍历许多数据)。

在这种情况下,您必须在完成输入后取消注册。

注册表只是Mage类的静态属性。查看详情

但我仍然找不到真正的解释

2)对于每个用户,服务器上的每个请求将有单独的注册表。

希望这在您的脑海中不会变得清晰


谢谢liyakat。在发布之前,我阅读了prattski.com/2014/09/23/using-the-magento-registry-mageregister:P但是,Magento如何映射变量和用户?
Hashid 2014年

1
@Hashid,您也可以通过Alan的博客获得更多想法。注册表如何处理代码中的每个请求。alanstorm.com/magento_registry_singleton_tutorial
liyakat 2014年

还要阅读:-)
Hashid 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.