29 votes

Magento getSingleton confusion

Je suis un peu confus sur les appels que je vois pour Mage::getSingleton, et je suis en espérant que quelqu'un peut m'aider à comprendre un peu mieux.

J'ai vu un morceau de code qui fait cela:

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

Je ne connais pas PHP, mais je pense que je peux faire une hypothèse sûre de la getSingleton nom de la méthode qu'il n'y aura qu'une seule instance de la classe spécifiée (la classe étant précisé en tant que regroupées nom de la classe, et que la résolution de app/code/core/Mage/Customer/Model/Session.php - classe conteneur Mage_Customer_Model_Session.

Question 1 -

Comment le getSingleton méthode savons de regarder dans le Modèle de dossier pour la classe?

Question 2 -

Donc, il est une instance de la classe pour l'ensemble ... je veux dire de la JVM comme je suis de Java arrière-plan, mais je vais le dire moteur PHP, dans l'espoir que c'est vaguement la terminologie appropriée; l' Mage_Customer_Model_Session n'est pas passé par un id de client ou de l'identificateur, pourtant, nous appelons la méthode isLoggedIn()! Donner n'est pas un Mage_Customer_Model_Session instance par le client, comment peut-on demander à un singleton si un client est connecté lorsque nous ne nous raconte pas ce que le client nous parlons?

Question 3 -

J'ai vu des appels à l' Mage::getSingleton('core/session') et Mage::getSingleton('customer/session') - quelle est la différence?

Merci pour toute aide.

74voto

Alan Storm Points 82442

Tout d'abord, avant de nous rendre à Magento, il est important de comprendre que PHP a radicalement différent du modèle de processus de Java. PHP singleton (indépendamment de Magento participation) est en une seule instance d'une classe par Requête HTTP. Un programme PHP n'est pas persistant dans la mémoire de la même façon qu'un programme Java est, afin d'ajuster vos attentes d'un "singleton" en conséquence.

Ensuite, il est important de comprendre que Magento est un cadre de travail intégré sur le dessus de PHP, à l'aide de PHP, et dans de nombreux cas, l'original de développeurs Magento voulu pousser les choses vers une plus Java comme de l'architecture. Donc, vous allez voir des choses qui vous paraissent familiers, sont familiers, mais susceptible de varier à la manière de ce que vous êtes habitué parce qu'ils ont encore besoin de le tailler à PHP version de l'univers.

Magento utilise un modèle de fabrique pour instancier des Aides, des Blocs, et le "Modèle" des classes. La chaîne

core/session

est une classe d'alias. Cet alias est utilisé pour la recherche d'un nom de classe dans Magento configuration. En bref, cette chaîne est convertie en chemin expressions de recherche de Magento fichiers de configuration pour dériver un nom de classe, en fonction du contexte (aide, bloc, modèle), il avait été appelé. Pour une version plus complète, voir mon Magento de l'Instanciation de Classe de chargement automatique de l'article.

Le concept de "Modèle" est un peu floue dans Magento. Dans certains cas, les modèles sont utilisés en tant que domaine, ou les modèles de service. Dans d'autres cas, ils sont utilisés comme des moyens plus traditionnels middleware de base de données de la persistance des modèles. Après avoir travaillé avec le système pendant quelques années, je pense que la façon la plus sûre de penser à des Modèles est qu'ils sont de Magento tenter de faire disparaître direct de l'instanciation de classe.

Il y a deux façons d'instancier une classe de modèle.

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

Le premier formulaire, vous obtenez une nouvelle instance de classe. Le deuxième formulaire vous permet d'obtenir une instance de la classe singleton. Cette Magento abstraction permet de créer un singleton de toute Magento modèle de classe, mais seulement si vous vous en tenez à Magento instanciation des méthodes. C'est, si vous appelez

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

les appels suivants à

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

sera de retour que l'instance du singleton. (Ceci est mis en œuvre avec un modèle de registre). Cependant, il n'y a rien qui vous empêche d'directement de l'instanciation d'une nouvelle instance de la classe avec soit

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

Ce qui nous amène à des séances. PHP la demande de modèle, comme HTTP, a été conçu à l'origine pour être apatrides. Chaque demande est livré dans le système, et seulement avec l'information de l'utilisateur. Comme la langue (et le web) se sont déplacés vers une plate-forme d'application, un système qui permettait à l'information d'être persisté a été introduit pour remplacer les systèmes "maison" ont été créées. Ce système a été appelé sessions. PHP séances de travail en exposant un super global $SÉANCES de tableau à la fin de l'utilisateur-programmeur qui permettent de stocker des informations par le web de l'utilisateur. Les Sessions sont mis en œuvre en mettant un ID unique dans un cookie sur l'utilisateur final, et puis en utilisant le cookie comme une recherche de la clé (également de pratique courante pour les applications web)

À son tour, le système Magento construit une abstraction sur le dessus de PHP à la session de l'abstraction. Dans Magento, vous pouvez créer un "modèle de session" qui hérite d'une base de classe session, des données de jeu de membres sur elle, et d'enregistrer/charger les données des membres, comme vous le feriez avec une base de données de la persistance du modèle. La différence est de l'information est stockée dans la session au lieu de la base de données du magasin. Quand vous voyez

core/session
customer/session

ce sont deux différents session de modèles, chacun le stockage de données différentes. L'une appartient à l'Mage_Core module, l'autre appartient à la Mage_Customer modèle. Ce système permet aux modules de sûre et de manipuler leur propre session de données, en évitant de marcher sur un autre module, les orteils, et de fournir des logiques de classe de méthodes pour la manipulation des données.

Espérons que les réponses aux questions que vous avez posées, ainsi que celles que vous n'avez pas.

8voto

vsushkov Points 1961
  1. Magento getSingleton est presque le même que getModel. La différence est getModel toujours retourne une nouvelle instance d'une classe, et getSingleton crée une nouvelle instance d'une classe qu'une seule fois, puis retourne toujours cette instance. Voir l' Mage::getSingleton et Mage::getModel méthodes. Magento sait à regarder sur le Modèle de dossier en raison de configs dans l' config.xml le fichier (. f.e. Mage/Customer/etc/config.xml). Voir le Magento wiki pour les développeurs pour en savoir plus sur les fichiers de configuration.

  2. Vous ne spécifiez pas le client directement. C'est fait automatiquement par Magento dans les classes parent d' Mage_Customer_Model_Session (voir Mage_Core_Model_Session_Abstract_Varien::start() méthode)

  3. Magento n'a pas une classe session de discriminer les données de session. Par exemple, l'ID client est stocké dans Mage_Customer_Model_Session d'erreur et le message flash 'Produit n'est pas disponible" sera stocké dans l' Mage_Catalog_Model_Session classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X