Qu'est-ce que l'aide dans Magento?

22

Qu'est-ce que l'aide dans Magento?

Dans quels cas doit-on utiliser et non utiliser des aides?

Supersonique
la source

Réponses:

27

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.phpdans chaque module et le laisser vide.

Marius
la source
La seule véritable «utilisation» que j'ai trouvée pour les assistants est qu'ils sont toujours garantis comme un singleton. J'ai travaillé sur un code héréditaire éducatif qui chargeait des collections dans des foreachboucles 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é getModelau lieu de getSingletonsi je l'avais placé dans un modèle.
Luke Rodgers
@LukeRodgers. Je vois votre point mais je ne pense pas que "peut avoir accidentellement appelé getModel au lieu de getSingleton" soit une vraie raison d'utiliser des helpers. Je peux affirmer que vous pouvez «accidentellement» appeler «supprimer» au lieu de «enregistrer». Quelle protection pouvez-vous faire pour éviter cela? Je suppose que «faire attention» fait partie du développement logiciel.
Marius
D'accord. Dans ces scénarios, je suppose que j'essaie simplement de coder défensivement contre l'humanité.
Luke Rodgers
Comment feriez-vous pour ajouter des méthodes personnalisées aux assistants principaux?
tecjam
13

La question a deux aspects:

  1. Dois-je écrire mes propres aides et pourquoi?
  2. Dois-je utiliser les assistants principaux et pourquoi?

1. Aide à la rédaction

En général, ayant des classes nommées Helper, Utilou 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 staticou même functionssans 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_Abstracts'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.


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 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 XML
  • Mage::helper('core') méthodes: date localisée, formatage des prix et des devises, échappement et encodage des données
  • Mage::helper('tax') méthodes pour obtenir des informations de la configuration fiscale et calculer les prix en fonction de cette
  • Mage::helper('catalog/image') fournit une interface pour créer des images de catalogue mises en cache et redimensionnées et récupérer leur URL
  • Mage::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_Comparequi a une $_itemCollectionpropriété qui ne peut être initialisée qu'une seule fois et une $_customerIdproprié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/imageassistant 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:

  • Les assistants principaux contiennent des outils utiles.
  • Vous avez besoin d'aide pour la traduction
  • Les aides devraient être apatrides
  • Dans vos propres modules, évitez d'utiliser des assistants comme collections de fonctions assorties. Dans la plupart des cas, vous pouvez trouver un endroit plus approprié
Fabian Schmengler
la source
J'ai souvent utilisé des assistants dans des intégrations ERP simples basées sur des fichiers plats. Ils ne font qu'écrire et lire des fichiers à partir de répertoires locaux et mettre à jour d'autres objets (produit, commande, etc.). Ils n'ont pas d'états ou de tableaux correspondants dans les cas mentionnés. Quel est votre avis là-dessus?
musicliftsme
1
Cela ne viole "aucun effet secondaire". Mon point de vue habituel sur la lecture et l'écriture de fichiers Readeret de Writermodè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 OrderStatusCsvReadermodèle qui est utilisé par un OrderStatusUpdatermodè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"
Fabian Schmengler
4

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.

Fabian Blechschmidt
la source
2

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.

Patrick van Bergen
la source
1

Les aides sont utiles pour éviter la duplication de code (dans les modèles, modèles, ...) et parfois elles sont juste nécessaires.

  • pour vérifier si votre module personnalisé est activé, vous pouvez placer quelque chose comme 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:
    • si, par exemple, le chemin de configuration change pour une raison quelconque, il vous suffit d'ajuster un fichier
    • vous pouvez réécrire la isEnabled()méthode helpers et cela affectera toutes les classes qui l'utilisent, au lieu de réécrire plusieurs fichiers
  • 13e @ Comment écrire une extension personnalisée? : Ne réécrivez pas les classes sauf si cela est nécessaire. Utilisez des observateurs et s'il n'est pas possible d'utiliser des méthodes d'assistance qui reçoivent comme paramètre et instance d'une classe que vous souhaitez remplacer. Mauvais: remplacer Mage_Catalog_Model_Productpour ajouter la méthode getProductArticles(). Oui . Dans votre aide, ajoutezgetProductArticles(Mage_Catalog_Model_Product $product)
  • rendre les mises à jour de mise en page plus flexibles en utilisant <action method="someMethod"><var helper="module/method" /></action>

Vous pouvez simplement créer un assistant appelé Data.phpdans chaque module et le laisser vide .

Lorsque vous utilisez PHPUnit, vous devez ajouter une seule ligne :protected $_moduleName = 'My_Module';

sv3n
la source