Best practice per Magento 2 per posizioni e nomi delle classi


15

In Magento 1eravamo abituati a mettere le nostre classi in queste directory

  • Bloccare
  • aiutante
  • Modello
  • Risorsa

e usa un semplice nome di classe senza maiuscole nel mezzo del nome.

Se diamo un'occhiata ad alcuni casi in Magento 2 Core

Helpers

Posizione :
- \Foo\Bar\Helper
Nome :
- *.php
Esempi :
- \Magento\ImportExport\Helper\Report
-\Magento\Cms\Helper\Wysiwyg\Images


Gli osservatori

Posizione :
- \Foo\Bar\Observer
Nome :
- *.php
- *Observer.php
Esempi :
- \Magento\CustomerCustomAttributes\Observer\SalesOrderAddressAfterLoad
-\Magento\CustomerBalance\Observer\ProcessBeforeOrderPlaceObserver


plugin

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


ConfigProvider

Posizione :
- \Foo\Bar\Model
Nome :
- *ConfigProvider.php
Esempi :
- \Magento\Tax\Model\TaxConfigProvider
-\Magento\Payment\Model\IframeConfigProvider


Le mie domande sono:

  • Se ci sono good/ bad/ bestpratiche per questo in Magento 2?
  • Se voglio creare un'abitudine, DataProviderad esempio, quale sarà?
    • \Foo\Bar\Provider\CustomDataProvider
    • \Foo\Bar\DataProvider\Custom
    • \Foo\Bar\Model\Provider\CustomDataProvider
    • \Foo\Bar\Helper\Provider\CustomDataProvider
  • Come determinare la costruzione del nome e della posizione della classe, una cartella nella radice del modulo, in Modello, in Helper, ecc.?
  • Dipende dall'origine / tipo di dati recuperati?
  • Quando dobbiamo aggiungere il suffisso al nome della classe?


Una parte di una risposta per Virtual Types: https://community.magento.com/t5/Magento-DevBlog/Virtual-Types-Naming-Convention/ba-p/61510

Risposte:


10

Magento 2 non è limitato come Magento 1 a poche cartelle come blocco, supporto, modello e così via.
In pratica puoi posizionare una classe in qualsiasi cartella desideri. Dipende da te poiché la classe viene istanziata usando il nome completo della classe non con alias come in Magento 1.

La mia raccomandazione è di raggrupparli in base alla funzionalità.

  • osservatori in Vendor/Module/Observer.
  • plug-in Vendor/Module/Plugin
  • fornitori di dati in Vendor/Module/DataProvider.
  • ui classi relative ai componenti in Vendor/Module/Ui

ma cerca di evitare la duplicazione dei nomi. Voglio dire Vendor/Module/DataProvider/CustomDataProvidersarebbe ridondante.

Forse il suffisso può essere aggiunto solo per le interfacce, anche se le persone potrebbero discuterne.

Riassumendo, dipende da te come lo fai, basta essere coerenti in esso.

Dal punto di vista della funzionalità non è importante dove si posizionano le classi. Puoi persino impazzire con loro e metterli tutti direttamente nella Vendor/Modulecartella, ma probabilmente non lo vuoi.

Penso (ma non del tutto sicuro) che l'unica limitazione sia che i controller devono essere nella cartella Controller.


Sono d'accordo che possiamo impazzire, è un buon punto tanto quanto uno cattivo ma come hai detto è secondo il nostro modo di vedere le cose. Forse quando Magento condivide le loro visioni tecniche interne come annunciato al MagentoLive France avremo maggiori informazioni su questi punti Grazie per aver condiviso la tua opinione
Matthéo Geoffray,

7

Credo che sia basato sull'opinione, ma sono d'accordo che ci sono alcune incongruenze riguardo alla denominazione delle classi e alle posizioni in M2.

Ecco l'elenco che ho creato per quanto riguarda la denominazione delle cartelle. Per me dovresti sempre usare quelle cartelle quando puoi per rendere il tuo modulo più facile da navigare e capire per chiunque altro:

  • Bloccare
  • controllore
  • Modello
  • Osservatore
  • Impostare
  • Test
  • Ui
  • eccetera
  • i18n
  • Visualizza
  • cron
  • aiutante
  • consolle
  • Api
  • Collegare
  • DataProvider

Inoltre, M2 utilizza alcune cartelle molto specifiche ma non le ho incluse in questo elenco:

  • Prezzi
  • App
  • Dati dei clienti
  • Servizio
  • porta
  • File
  • Adattatore
  • Componente
  • TemplateEngine

La cosa buona di M2 è che puoi usare e creare qualunque cartella ti serva. Se qualcosa non appartiene all'elenco sopra, crea la tua cartella e inserisci le tue classi semplicemente cerca di essere coerente.


In tutte le tue risposte troviamo la stessa idea, la possibilità di fare ciò che vogliamo, l'essere più importante per rimanere coerente e regolare nella sua costruzione. Tuttavia sarebbe fantastico per Magento condividere alcune visioni interne su questo mentre annunciavano alla ML. Come hai detto, sarà più facile per tutti comprendere le estensioni Core e Community. Grazie per la tua risposta.
Matthéo Geoffray,

6

Penso che la massima priorità dovrebbe essere quella di rendere il codice il più autocompattante possibile. Quindi, piuttosto che mettere tutto nelle directory Model o Helper, trovare un buon nome che descriva cosa fa il codice sottostante è un approccio migliore. Certo, è anche più difficile perché richiede molto più pensiero.

Ad esempio, anziché utilizzare Model/Config/Converter.php, il nome OrderStateMachine/TransitionsConfiguration/XmlToArrayConverter.phpdice molto di più su ciò che fa un modulo e una classe.


Come hai detto, è necessario pensare di più per chiarirci, ma anche per chiunque veda l'estensione. Ciò rende le cose più difficili al momento, ma più efficaci nel tempo. Grazie per la risposta
Matthéo Geoffray,

3

Ci sono già alcune risposte davvero buone sopra. Quello che vorrei aggiungere è che dovresti evitare di mettere il codice sotto app/codee invece usare un metodo di installazione basato sul compositore che finirà per mettere il tuo codice sotto vendor/.


Sì, non preoccuparti, ne sono consapevole, il formato è solo per l'esempio nella mia domanda :) Ma hai ragione per le persone che non sanno che modificherò per renderlo chiaro. Grazie
Matthéo Geoffray il

questo è un buon punto di testa
Amit Bera
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.