Понимание Magento Registry


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 определит, какой пользователь вызвал данные реестра?

Я прочитал статью в блоге Алана Шторма, а также его ответ на StackOverFlow по этому поводу. Но я не мог убить путаницу. Пожалуйста, поправьте меня, если вы считаете, что мои основы испорчены. Благодарность




спасибо Amit Bera, я читал эту статью и ответ SOF Алана, прежде чем опубликовать этот вопрос. Я не мог получить свои ответы оттуда.
Хашид

Ответы:


23

Реестр хранит данные в памяти, которая является специфической для этого запроса (а не пользователя или чего-либо еще) и сохраняется только в течение этого запроса. На самом деле этот принцип очень прост Mage: экземпляр создается как одиночный объект для каждого запроса, а созданный объект Mage остается в памяти и доступен во всех классах (и шаблонах) до тех пор, пока запрос не будет завершен и ответ не будет отправлен.

Поскольку объект является одноэлементным, при каждом обращении к нему вы получаете один и тот же объект. Все, что происходит, это то, что вы сохраняете значения в этом объекте, поэтому, когда один класс сохраняет значение, а другой обращается к нему, они оба работают с одним и тем же объектом, и второй класс может извлечь значение из первого набора классов.


1
Таким образом, он жив только для одного запроса? Это означает, что если я загружаю страницу в Magento, один запрос завершен, и данные реестра сбрасываются?
Хашид

4
Значения Да, которые вы установили, Mage::register()сохраняются только для этого запроса. Если вы хотите хранить специфичные для пользователя данные, вам следует использовать сеанс, реестр действительно предназначен для переноса данных между классами.
Джонатан Хасси

1
это имеет смысл! То же самое относится и к экземпляру синглтона?
Хашид

1
Да, точно так же - если вы посмотрите на getSingleton()метод Mageкласса, он фактически сохраняет данные в реестре.
Джонатан Хасси

3

Реестр хранится в памяти и выполняется по HTTP-запросу, поэтому вы не можете обмениваться данными между различными запросами или пользователями.


Но как Magento отобразит HTTP-запрос и реестр?
Хашид

2

Реестр Magento хранится в памяти приложения .

когда ваш скрипт завершает работу, все, что вы сохранили в реестре, исчезает, поэтому вам не нужно беспокоиться об его очистке (если только скрипт, который вы запускаете, не хранит большие объекты в реестре и не перебирает много данные).

В этом случае вы должны отменить регистрацию ваших записей, когда вы закончите с ними.

Реестр - это просто статическое свойство класса Mage. смотрите для деталей

но все же я не мог найти хорошее объяснение

2) для каждого пользователя будет отдельный реестр для каждого запроса на сервере.

надеюсь, это прояснит вам немного


спасибо liyakat. Я прочитал prattski.com/2014/09/23/using-the-magento-registry-mageregister перед публикацией: P Но как Magento отобразит переменную и пользователя?
Хашид

1
@ Хашид, ты можешь получить больше идей с блогом Алана. как реестр работает с каждым запросом в коде, следуйте. alanstorm.com/magento_registry_singleton_tutorial
liyakat

прочитайте это также :-)
Хашид
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.