Подтвердить что ты не робот

Путаница Magento getSingleton

Я немного запутался в звонках, которые я вижу в 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 не передается в идентификаторе клиента или любом таком идентификаторе, но мы вызываем метод isLoggedIn()! Дайте, чтобы не было экземпляра Mage_Customer_Model_Session для каждого клиента, как мы можем спросить синглтон, если клиент вошел в систему, когда мы не говорим о том, что клиент, о котором мы говорим?

Вопрос 3 -

Я видел вызовы Mage::getSingleton('core/session') и Mage::getSingleton('customer/session') - в чем разница?

Спасибо за любую помощь.

4b9b3361

Ответ 1

Прежде всего, прежде чем мы перейдем к Magento, важно понять, что PHP имеет принципиально другую модель процесса, чем Java. Синглтон PHP (независимо от участия Magento) - это единственный экземпляр класса для HTTP-запроса. PHP-программа не является постоянной в памяти так же, как и Java-программа, поэтому соответствующим образом корректируйте свои ожидания "singleton".

Далее важно понять, что Magento - это построенная фреймворком сверху PHP, с использованием PHP, и во многих случаях оригинальные разработчики Magento хотели подтолкнуть вас к более похожей на Java архитектуре. Итак, вы увидите вещи, которые выглядят знакомыми, знакомы, но, вероятно, будут отличаться каким-то значительным образом от того, к чему вы привыкли, потому что им все равно нужно использовать PHP-версию юниверса.

Magento использует шаблон factory для создания экземпляров классов "Помощники", "Блоки" и "Модель". Строка

core/session

- псевдоним класса. Этот псевдоним используется для поиска имени класса в конфигурации Magento. Короче говоря, эта строка преобразуется в выражения пути, которые ищут файлы конфигурации Magento для получения имени класса, на основе контекста (хелпера, блока, модели), в котором он был вызван. Для более длинной версии см. Мой Magento Class Instantiation Autoload.

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

Существует два способа создания экземпляра класса модели.

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

В первой форме вы получите новый экземпляр класса. Вторая форма даст вам экземпляр класса singleton. Эта абстракция Magento позволяет создать синглтон из любого класса модели Magento, но только если вы придерживаетесь методов создания Magento. То есть, если вы вызываете

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

затем последующие вызовы

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

вернет этот экземпляр singleton. (Это реализовано с помощью шаблона реестра). Тем не менее, нет ничего, что помешало бы вам непосредственно создавать экземпляр класса с помощью

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

Это приводит нас к занятиям. Модель запроса PHP, такая как HTTP, изначально была предназначена для безгражданства. Каждый запрос поступает в систему с информацией только от пользователя. По мере того, как язык (и Интернет) продвигался к платформе приложений, была введена система, которая позволяла сохранять информацию, чтобы заменить доморощенные системы, которые возникали. Эта система называлась сеансами. Сессии PHP работают, предоставляя супер глобальный массив $_SESSION для конечного пользователя-программиста, который позволяет хранить информацию на основе веб-пользователей. Сеансы выполняются путем установки уникального идентификатора в качестве файла cookie в конце пользователя, а затем использования этого файла cookie в качестве ключа поиска (также стандартной практики для веб-приложений).

В свою очередь, система Magento создает абстракцию поверх абзаца сеанса PHP. В Magento вы можете создать "модель сеанса", которая наследуется от базового класса сеанса, устанавливать на нем элементы данных и сохранять/загружать эти элементы данных так же, как и с моделью сохранения базы данных. Разница заключается в том, что информация хранится в сеансе, а не в хранилище базы данных. Когда вы видите

core/session
customer/session

это две разные модели сеансов, каждая из которых хранит разные данные. Один принадлежит модулю Mage_Core, другой принадлежит модели Mage_Customer. Эти системы позволяют модулям безопасно устанавливать и обрабатывать свои собственные данные сеанса, не случайно наступая на другие пальцы модуля и предоставляют методы логического класса для управления этими данными.

Надеюсь, это ответит на заданные вами вопросы, а также те, которые вы не сделали.

Ответ 2

  • Magento getSingleton почти такой же, как getModel. Разница заключается в том, что getModel всегда возвращает новый экземпляр класса, а getSingleton создает новый экземпляр класса только один раз, а затем всегда возвращает этот экземпляр. См. Методы Mage::getSingleton и Mage::getModel. Magento знает о поиске папки Model из-за конфигураций в файле config.xml (f.e. Mage/Customer/etc/config.xml). См. Magento wiki для разработчиков, чтобы узнать больше о файлах конфигурации.

  • Вы не указываете клиента напрямую. Это сделано автоматически Magento в родительских классах Mage_Customer_Model_Session (см. Метод Mage_Core_Model_Session_Abstract_Varien::start())

  • Magento не имеет одного класса сеанса для распознавания данных сеанса. Например, идентификатор клиента хранится в Mage_Customer_Model_Session, и сообщение об ошибке "Продукт недоступен" будет храниться в классе Mage_Catalog_Model_Session.