Magento getSingleton confusion

Jestem trochę zdezorientowany telefonami, do których widzę Mage::getSingleton, i mam nadzieję, że ktoś pomoże mi zrozumieć trochę lepiej.

Widziałem fragment kodu rdzenia, który robi to:

Mage::getSingleton('customer/session')->isLoggedIn()

Nie znam PHP, ale myślę, że mogę bezpiecznie założyć z nazwy metody getSingleton, że będzie tylko jedna instancja podanej klasy (klasa jest określona jako nazwa klasy zgrupowanej i rozwiązuje się na app/code/core/Mage/Customer/Model/Session.php - zawierającą klasę Mage_Customer_Model_Session.

Pytanie 1 -

Skąd metoda getsingletona wiedziała, aby szukać w folderze modelu dla klasy?

Pytanie 2 -

Jest więc jedna instancja klasy dla całości ... Chcę powiedzieć JVM, ponieważ pochodzę z Javy, ale powiem silnik PHP w nadziei, że jest to niejasno poprawna terminologia; Mage_Customer_Model_Session nie jest przekazywany w ID klienta lub jakimkolwiek takim identyfikatorze, ale nazywamy metodę isLoggedIn()! Dać nie ma Mage_Customer_Model_Session instancji na klienta, jak możemy zapytaj singleton, czy klient jest zalogowany, gdy nie powiemy mu, o jakim kliencie mówimy?

Pytanie 3 -

Widziałem połączenia do Mage::getSingleton('core/session') i do Mage::getSingleton('customer/session') - co za różnica?

Dziękuję za pomoc.
 41
Author: Elavarasan, 2011-11-08

2 answers

Najpierw, zanim przejdziemy do Magento, ważne jest, aby zrozumieć, że PHP ma radykalnie inny model procesu niż Java.  PHP singleton (niezależnie od zaangażowania Magento) jest pojedynczą instancją klasy na żądanie HTTP .  Program PHP nie jest trwały w pamięci tak samo jak program Java, więc dostosuj swoje oczekiwania względem "Singletona" odpowiednio.   

Następnie ważne jest, aby zrozumieć, że Magento jest frameworkiem zbudowanym na górze PHP, używając PHP i w wielu przypadkach oryginalni Programiści Magento chcieli popchnąć rzeczy w kierunku architektury bardziej podobnej do Javy.  Więc zobaczysz rzeczy, które wyglądają znajomo, są znajome, ale prawdopodobnie różnią się w jakiś sposób od tego, do czego jesteś przyzwyczajony, ponieważ nadal muszą hew do wersji PHP wszechświata. 

Magento używa wzorca fabrycznego do tworzenia instancji Helperów, bloków i klas" modelowych".  Ciąg
core/session

Jest aliasem klasy.  Ten alias jest używany do wyszukiwania nazwy klasy w Magento konfiguracja. Krótko mówiąc, łańcuch ten jest konwertowany na wyrażenia ścieżki, które przeszukują pliki konfiguracyjne Magento w celu uzyskania nazwy klasy, w oparciu o kontekst (helper, blok, model), w którym został wywołany. Dla dłuższej wersji, zobacz mój Magento ' S Class Instantiation Autoload artykuł.

W Magento pojęcie "modelu" jest nieco rozmyte.  W niektórych przypadkach modele są używane jako domeny lub modele usług.  W innych przypadkach są one używane jako bardziej tradycyjna baza danych middleware modelki.  Po kilku latach pracy z systemem, myślę, że najbezpieczniejszym sposobem myślenia o modelach jest próba pozbycia się bezpośredniej instancji klasy przez Magento.

Są dwa sposoby tworzenia instancji klasy modelu. 

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

Pierwszy formularz da ci nową instancję klasy.  Drugi formularz da ci instancję klasy singleton.  Ta konkretna abstrakcja Magento pozwala stworzyć singleton z dowolnej klasy modelu Magento, ale tylko wtedy, gdy trzymasz się Metody tworzenia instancji Magento.  To znaczy, jeśli zadzwonisz

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

Następnie kolejne wywołania do

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

Zwróci instancję singleton.  (Jest to realizowane za pomocą wzorca rejestru). Jednak nic nie stoi na przeszkodzie, aby bezpośrednio utworzyć nową instancję klasy za pomocą

$o = Mage::getModel('groupname/classname');
$o = new Mage_Groupname_Model_Classname();
Co prowadzi nas do sesji.  Model żądania PHP, podobnie jak HTTP, został pierwotnie zaprojektowany jako bezpaństwowy.  Każde żądanie trafia do systemu z i tylko z informacjami od użytkownika.  W miarę jak język (i sieć) przechodził w kierunku platformy aplikacji, wprowadzono system, który pozwalał na utrwalanie informacji, aby zastąpić rodzime systemy, które powstawały.  System ten nazywany był sesjami.  Sesje PHP działają poprzez wystawienie super globalnej tablicy $_SESSION dla użytkownika końcowego programisty, która pozwala na przechowywanie informacji na podstawie każdego użytkownika sieci.  Sesje są realizowane przez ustawienie unikalnego identyfikatora jako pliku cookie na końcu użytkownika, a następnie za pomocą tego plik cookie jako klucz Wyszukiwania (również standardowa praktyka dla aplikacji internetowych)

Z kolei system Magento buduje abstrakcję na bazie abstrakcji sesji PHP.  W Magento możesz utworzyć "model sesji", który dziedziczy z podstawowej klasy sesji, ustawia na niej elementy danych i zapisuje/ładuje te elementy danych tak, jak w przypadku modelu trwałości bazy danych.  Różnica polega na tym, że informacje są przechowywane w sesji zamiast w bazie danych. Kiedy widzisz

core/session
customer/session

Są to dwa różne modele sesji, z których każdy przechowuje inne dane. Jeden należy do modułu Mage_Core, drugi do modelu Mage_Customer.  System ten pozwala modułom na bezpieczne ustawianie i manipulowanie własnymi danymi sesji, bez przypadkowego wchodzenia na palce innego modułu i zapewnia logiczne metody klasowe do manipulowania tymi danymi.

Mam nadzieję, że to odpowie na pytania, które zadałeś, a także na te, które nie.]}
 98
Author: Alan Storm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-01 15:49:05
  1. GetSingleton Magento jest prawie taki sam jak getModel. Różnica polega na tym, że getModel zawsze zwraca nową instancję klasy, a getSingleton tworzy nową instancję klasy tylko raz, a następnie zawsze zwraca tę instancję. Zobacz metody Mage::getSingleton i Mage::getModel. Magento wie o szukaniu folderu modelu ze względu na configs w pliku config.xml (np. Mage/Customer/etc/config.xml). Zobacz Magento wiki dla programistów {[12] } aby dowiedzieć się więcej o plikach konfiguracyjnych.

  2. Nie określasz klient bezpośrednio. Jest to wykonywane automatycznie przez Magento w klasach nadrzędnych Mage_Customer_Model_Session (patrz metoda Mage_Core_Model_Session_Abstract_Varien::start())

  3. Magento nie ma jednej klasy sesji do rozróżniania danych sesji. Na przykład identyfikator klienta jest przechowywany w Mage_Customer_Model_Session, A komunikat o błędzie "produkt nie jest dostępny" będzie przechowywany w klasie Mage_Catalog_Model_Session.

 11
Author: vsushkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-08 11:43:15