Magento getSingleton растерянность - PullRequest
42 голосов
/ 08 ноября 2011

Я немного озадачен вызовами, которые я вижу на 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()! Giveна каждого клиента не приходится Mage_Customer_Model_Session, как мы можемСинглтон, если клиент вошел в систему, когда мы не сказали ему, о каком клиенте мы говорим?

Вопрос 3 -

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

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

Ответы [ 2 ]

99 голосов
/ 08 ноября 2011

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

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

Magento использует фабричный шаблон для создания экземпляров классов Helpers, Blocks и «Model».Строка

core/session

является псевдонимом класса.Этот псевдоним используется для поиска имени класса в конфигурации Magento.Короче говоря, эта строка преобразуется в выражения пути, которые выполняют поиск в файлах конфигурации Magento для получения имени класса на основе контекста (помощник, блок, модель), в котором он был вызван. Более подробную версию см. В моей автоматической загрузке класса Magento. article.

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

Есть два способа создания экземпляра класса модели.

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

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

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

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

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

вернут этот экземпляр-одиночка.(Это реализовано с помощью шаблона реестра).Однако ничто не мешает вам непосредственно создавать новый экземпляр класса с помощью

$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.Эти системы позволяют модулям безопасно устанавливать и манипулировать своими собственными данными сеанса без случайного наступления на пальцы другого модуля и предоставлять методы логического класса для манипулирования этими данными.

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...