Qu'est-ce que l'aide dans Magento?
Dans quels cas doit-on utiliser et non utiliser des aides?
la source
Qu'est-ce que l'aide dans Magento?
Dans quels cas doit-on utiliser et non utiliser des aides?
Théoriquement, vous ne devez jamais utiliser d'aides.
Les assistants ne sont que des collections de méthodes indépendantes et sont toujours instanciés comme des singletons.
Il s'agit essentiellement d'une programmation procédurale avec des fonctions regroupées sous un espace de noms (le nom de classe dans ce cas). Mais comme Magento a des aides dans le noyau, vous pouvez y mettre vos méthodes que vous ne savez pas où les mettre ou si vous devez les appeler dans de nombreux endroits différents (modèles, contrôleurs, modèles)
Utilisez-les en dernier recours.
Magento nécessite également un assistant pour chaque module pour des raisons de traduction.
Vous pouvez simplement créer un assistant appelé Data.php
dans chaque module et le laisser vide.
foreach
boucles et toutes sortes de folie. J'ai trouvé utile de rendre cette logique terrifiante à un assistant et de l'utiliser comme cache d'objets pour être utile, et j'ai laissé peu de place aux erreurs des futurs développeurs qui pourraient avoir accidentellement appelégetModel
au lieu degetSingleton
si je l'avais placé dans un modèle.La question a deux aspects:
1. Aide à la rédaction
En général, ayant des classes nommées
Helper
,Util
ou similaire dit simplement «J'ai quelques fonctions que je ne sais pas où mettre » et ne font pas beaucoup de sens en tant que classe.Magento instancie les assistants en tant que singletons et la plupart des assistants principaux n'ont aucun état, donc les méthodes pourraient aussi bien être
static
ou mêmefunctions
sans classe. Tout cela est souvent considéré comme une odeur de code , une faille dans la conception de l'application.Comme Marius l'a déjà souligné, vous n'avez pas besoin d'utiliser des assistants pour votre propre code. Créez simplement un assistant vide par défaut par module si vous utilisez des traductions spécifiques au module, sinon elles ne fonctionneront pas. Préférez des modèles (qui n'ont pas besoin d'être étendus
Mage_Core_Model_Abstract
s'ils ne représentent pas des données de base de données) ou des classes de bibliothèque indépendantes.Cependant, je ne serais pas trop strict à propos de "ne pas utiliser d'aide du tout" et plutôt de les utiliser pour des raccourcis de requête comme:
configuration du module d'accès:
méthodes d'usine pour les classes de bibliothèque
Vous pouvez trouver d'autres endroits mais à mon humble avis, l'aide au module est souvent assez bonne pour des choses comme ça.
2. Utiliser des aides
Consommer les aides de base est quelque chose que vous ferez assez souvent.
Exemples:
__()
méthode de traduction: Pour obtenir une traduction d'un module spécifique, vous devez utiliserMage::helper('module-alias')->__('string to be translated')
. Cela se produit implicitement si vous utilisez$this->__(...)
un modèle ou un bloc et si vous utilisez l'translate="..."
attribut dans des fichiers XMLMage::helper('core')
méthodes: date localisée, formatage des prix et des devises, échappement et encodage des donnéesMage::helper('tax')
méthodes pour obtenir des informations de la configuration fiscale et calculer les prix en fonction de cetteMage::helper('catalog/image')
fournit une interface pour créer des images de catalogue mises en cache et redimensionnées et récupérer leur URLMage::helper('catalog/product_url_rewrite')->joinTableToSelect()
joint la table de réécriture d'URL à une requête de collection de produits.Il y a beaucoup plus (plus ou moins) de fonctions utiles cachées dans les assistants principaux, si vous avez besoin d'une fonctionnalité spécifique susceptible d'être utilisée quelque part dans le noyau, vérifiez si vous pouvez réutiliser une méthode d'assistance.
Habituellement, ces assistants sont des objets sans état et les méthodes sont des méthodes de requête (c'est-à-dire qu'elles n'ont pas d'effets secondaires)
Mais comme toujours, Magento enfreint ses propres règles non écrites et ne doit pas être pris comme exemple. Un "bon" exemple de la façon de ne pas utiliser d'aides est celui
Mage_Catalog_Helper_Product_Compare
qui a une$_itemCollection
propriété qui ne peut être initialisée qu'une seule fois et une$_customerId
propriété qui peut être modifiée avec un setter. Vous trouverez quelques autres aides liées au catalogue avec les collections attachées. Écrire des tests pour le code qui les utilise ou les réutiliser dans un contexte différent n'est pas amusant, alors ne le faites pas à la maison.L'
catalog/image
assistant mentionné ci-dessus est un autre exemple d'un assistant qui ne devrait vraiment pas être un assistant. Vous devez d'abord passer un produitinit()
qui réinitialise son état actuel, puis vous définissez divers paramètres (commeresize()
,setQuality()
) et à la fin, vous pouvez obtenir l'URL avec sa__toString()
méthode. Cela a l'air bien lorsqu'il est utilisé dans un modèle, mais le code est un énorme gâchis et n'a pas de sens en tant que singleton.TL; DR:
la source
Reader
et deWriter
modèles, qui ont en fait un état (au moins une ressource de fichier). Par exemple, pour lire les données d'état d'une commande à partir d'un fichier CSV, j'aurais qc. lika unOrderStatusCsvReader
modèle qui est utilisé par unOrderStatusUpdater
modèle. De cette façon, je sépare également les préoccupations "lire les données du fichier" et "mettre à jour l'ordre dans Magento"Marius a raison. Je pense que les aides sont absurdes.
Mais dans la théorie de magento, vous devriez tout mettre dans des assistants qui ne changent pas l'état d'un objet, par exemple obtenir un prix formaté.
Mais tout ce que vous pouvez mettre dans une aide, vous pouvez aussi le mettre dans un modèle. Et vous pouvez obtenir différentes instances d'un modèle, ce qui est utile pour les tests.
la source
Je suis assez nouveau sur Magento, mais pour moi, il semble qu'un Helper soit l'équivalent de Magento d'un service : "un ensemble de fonctionnalités logicielles connexes qui peuvent être réutilisées à des fins différentes". Un module exporte ses fonctionnalités proposées via des services. Utilisez un assistant pour les fonctions que vous invitez d'autres modules à utiliser.
Un modèle ne doit fournir que des méthodes directement liées à l'obtention ou à la définition de l'état d'un objet, ou qui sont autrement liées à l'objet instancié du modèle.
la source
Les aides sont utiles pour éviter la duplication de code (dans les modèles, modèles, ...) et parfois elles sont juste nécessaires.
Mage::getStoreConfigFlag('my/module/enabled')
dans chaque fichier où vous souhaitez vérifier cela, ou vous utilisezMage::helper('my_module')->isEnabled()
avec des avantages:isEnabled()
méthode helpers et cela affectera toutes les classes qui l'utilisent, au lieu de réécrire plusieurs fichiersMage_Catalog_Model_Product
pour ajouter la méthodegetProductArticles()
. Oui . Dans votre aide, ajoutezgetProductArticles(Mage_Catalog_Model_Product $product)
<action method="someMethod"><var helper="module/method" /></action>
Lorsque vous utilisez PHPUnit, vous devez ajouter une seule ligne :
protected $_moduleName = 'My_Module';
la source