Qu'est-ce que l'aide dans Magento?
Dans quels cas doit-on utiliser et non utiliser des aides?
Qu'est-ce que l'aide dans Magento?
Dans quels cas doit-on utiliser et non utiliser des aides?
Réponses:
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.
La question a deux aspects:
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ême functions
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:
public function getFooBar()
{
return Mage::getStoreConfig('module/foo/bar');
}
méthodes d'usine pour les classes de bibliothèque
public function getNewFooService()
{
return new \Foo\Service(...);
}
Vous pouvez trouver d'autres endroits mais à mon humble avis, l'aide au module est souvent assez bonne pour des choses comme ça.
Consommer les aides de base est quelque chose que vous ferez assez souvent.
__()
méthode de traduction: Pour obtenir une traduction d'un module spécifique, vous devez utiliser Mage::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 produit init()
qui réinitialise son état actuel, puis vous définissez divers paramètres (comme resize()
, 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:
Reader
et de Writer
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 un OrderStatusCsvReader
modèle qui est utilisé par un OrderStatusUpdater
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.
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.
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 utilisez Mage::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éthode getProductArticles()
. Oui . Dans votre aide, ajoutezgetProductArticles(Mage_Catalog_Model_Product $product)
<action method="someMethod"><var helper="module/method" /></action>
Vous pouvez simplement créer un assistant appelé
Data.php
dans chaque module et le laisser vide .
Lorsque vous utilisez PHPUnit, vous devez ajouter une seule ligne :protected $_moduleName = 'My_Module';
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.