Magento 2 meilleures pratiques pour les emplacements et les noms des classes

15

Dans Magento 1nous étions habitués à placer nos classes dans ces répertoires

  • Bloquer
  • Assistant
  • Modèle
  • Ressource

et utilisez un nom de classe simple sans majuscule au milieu du nom.

Si nous examinons certains cas dans Magento 2 Core

Aides

Lieu :
- \Foo\Bar\Helper
Nom :
- *.php
Exemples :
- \Magento\ImportExport\Helper\Report
-\Magento\Cms\Helper\Wysiwyg\Images


Observateurs

Lieu :
- \Foo\Bar\Observer
Nom :
- *.php
- *Observer.php
Exemples :
- \Magento\CustomerCustomAttributes\Observer\SalesOrderAddressAfterLoad
-\Magento\CustomerBalance\Observer\ProcessBeforeOrderPlaceObserver


Plugins

Emplacement :
- \Foo\Bar\Plugin
Nom :
- *.php
- *Plugin.php
Exemples :
- \Magento\Catalog\Plugin\Block\Topmenu
- \Magento\PageCache\Model\App\FrontController\BuiltinPlugin
Source : http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html#declaring-a-plugin


ConfigProvider

Lieu :
- \Foo\Bar\Model
Nom :
- *ConfigProvider.php
Exemples :
- \Magento\Tax\Model\TaxConfigProvider
-\Magento\Payment\Model\IframeConfigProvider


Mes questions sont:

  • S'il y a des good/ bad/ bestpratiques pour cela dans Magento 2?
  • Si je veux créer un custom DataProviderpar exemple ce sera quoi?
    • \Foo\Bar\Provider\CustomDataProvider
    • \Foo\Bar\DataProvider\Custom
    • \Foo\Bar\Model\Provider\CustomDataProvider
    • \Foo\Bar\Helper\Provider\CustomDataProvider
  • Comment déterminer la construction du nom et de l'emplacement de la classe, un dossier à la racine du module, dans Model, dans Helper, etc.?
  • Cela dépend-il de la source de données / du type de données récupérés?
  • Quand devons-nous ajouter le suffixe au nom de la classe?


Une partie d'une réponse pour Virtual Types: https://community.magento.com/t5/Magento-DevBlog/Virtual-Types-Naming-Convention/ba-p/61510

Matthéo Geoffray
la source

Réponses:

10

Magento 2 n'est pas limité comme Magento 1 à seulement quelques dossiers tels que bloc, assistant, modèle et ainsi de suite.
Vous pouvez essentiellement placer une classe dans le dossier de votre choix. Cela dépend de vous puisque la classe est instanciée en utilisant le nom complet de la classe et non avec des alias comme dans Magento 1.

Ma recommandation est de les regrouper par fonctionnalité.

  • observateurs Vendor/Module/Observer.
  • plugins dans Vendor/Module/Plugin
  • fournisseurs de données en Vendor/Module/DataProvider.
  • classes liées aux composants ui Vendor/Module/Ui

mais essayez d'éviter la duplication des noms. Je veux dire Vendor/Module/DataProvider/CustomDataProviderserait redondant.

Peut-être que le suffixe ne peut être ajouté que pour les interfaces, bien que les gens s'y opposent.

Pour résumer, c'est à vous de voir comment vous le faites, soyez juste cohérent.

Du point de vue des fonctionnalités, peu importe où vous placez les classes. Vous pouvez même devenir fou avec eux et les placer tous directement dans le Vendor/Moduledossier, mais vous ne le voulez probablement pas.

Je pense (mais pas complètement sûr) que la seule restriction est que les contrôleurs doivent être dans le dossier Controller.

Marius
la source
Je suis d'accord qu'on peut devenir fou, c'est un bon point autant qu'un mauvais mais comme vous l'avez dit c'est selon notre façon de voir les choses. Peut-être que lorsque Magento partagera ses visions techniques internes comme annoncé lors du MagentoLive France, nous aurons plus d'informations sur ces points Merci de partager votre opinion
Matthéo Geoffray
7

Je pense que c'est basé sur l'opinion, mais je conviens qu'il y a des incohérences concernant le nom des classes et les emplacements dans M2.

Voici la liste que j'ai trouvée concernant la dénomination des dossiers. Pour moi, vous devez toujours utiliser ces dossiers lorsque vous le pouvez afin de rendre votre module plus facile à parcourir et à comprendre pour n'importe qui d'autre:

  • Bloquer
  • Manette
  • Modèle
  • Observateur
  • Installer
  • Tester
  • Ui
  • etc
  • i18n
  • vue
  • Cron
  • Assistant
  • Console
  • Api
  • Brancher
  • Fournisseur de données

En plus de cela, M2 utilise des dossiers très spécifiques mais je ne les ai pas inclus dans cette liste:

  • Tarification
  • App
  • Données client
  • Un service
  • passerelle
  • Des dossiers
  • Adaptateur
  • Composant
  • TemplateEngine

La bonne chose avec M2 est que vous pouvez utiliser et créer le dossier dont vous avez besoin. Si quelque chose n'appartient pas à la liste ci-dessus, créez votre propre dossier et mettez-y vos classes, essayez simplement d'être cohérent.

Raphael chez Digital Pianism
la source
Dans toutes vos réponses on retrouve la même idée, la possibilité de faire comme on veut, le plus important étant de rester cohérent et régulier dans sa construction. Cependant, ce serait formidable pour Magento de partager quelques visions internes à ce sujet, comme ils l'ont annoncé au ML. Comme vous l'avez dit, il sera plus facile pour tout le monde de comprendre les extensions Core et Community. Merci pour votre réponse.
Matthéo Geoffray
6

Je pense que la priorité absolue devrait être de rendre le code aussi documenté que possible. Donc, plutôt que de tout mettre dans les répertoires Model ou Helper, trouver un bon nom qui décrit ce que fait le code en dessous est une meilleure approche. Bien sûr, c'est aussi plus difficile car cela demande beaucoup plus de réflexion.

Par exemple, plutôt que d'utiliser Model/Config/Converter.php, le nom en OrderStateMachine/TransitionsConfiguration/XmlToArrayConverter.phpdit beaucoup plus sur ce qu'un module et une classe font.

Vinai
la source
Comme vous l'avez dit, cela nécessite plus de réflexion pour que cela soit clair pour nous mais aussi pour tous ceux qui voient l'extension. Cela rend les choses plus difficiles pour le moment mais plus efficaces au fil du temps. Merci pour votre réponse
Matthéo Geoffray
3

Il y a déjà de très bonnes réponses ci-dessus. Ce que je voudrais ajouter, c'est que vous devez éviter de placer du code sous app/codeet utiliser à la place une méthode d'installation basée sur le compositeur qui finira par placer votre code sous vendor/.

Kristof chez Fooman
la source
Oui ne vous inquiétez pas, je suis conscient de cela, le format est juste pour l'exemple dans ma question :) Mais vous avez raison pour les gens qui ne savent pas que je vais éditer pour que ce soit clair. Merci
Matthéo Geoffray
c'est bon point fooman
Amit Bera