Domanda

Quando penso di aver preso la testa avvolta attorno al sistema di MAGENTO 2 qualcosa arriva e non lo avvolge.
Vedo nel codice principale modi diversi per accedere a un aiutante.
Ad esempio in Magento\Catalog\Controller\Category::_initCategory c'è questo:

if (!$this->_objectManager->get('Magento\Catalog\Helper\Category')->canShow($category)) {
    return false;
}
.

Ma in Magento\Catalog\Block\Category\View l'helper è iniettato int è il costruttore

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    \Magento\Catalog\Model\Layer\Category $catalogLayer,
    \Magento\Framework\Registry $registry,
    \Magento\Catalog\Helper\Category $categoryHelper,
    array $data = array()
) {
    $this->_categoryHelper = $categoryHelper;
    $this->_catalogLayer = $catalogLayer;
    $this->_coreRegistry = $registry;
    parent::__construct($context, $data);
}
.

Questo mi ha portato a pensare che gli aiutanti dovrebbero essere accessibili in modo diverso in controller e blocchi (e modelli), ma poi ho trovato un controller in cui un aiutante viene iniettato nel Magento\Catalog\Controller\Adminhtml\Product\Action\Attribute del costruttore.

Si prega di cancellare la nebbia per me.
Quando dovrei usare DI e quando dovrei usare objectManager?E perché?
Ho letto questa domanda: istanziazione aiutanti in magento 2 .Questa è solo una domanda di follow-up su questo.

È stato utile?

Soluzione

Preferirei di possibile, come usare il gestore dell'oggetto è già una violazione contro la legge del demetra.Quando si utilizza il gestore dell'oggetto queste dipendenze sono semplicemente nascoste nella logica del metodo.

Altri suggerimenti

Non conosco così tanto della magenta implementazione, ma sembra che il ObjectManager sia un Localizzatore di servizi .

Generalmente l'utilizzo di un localizzatore di servizio per accedere a dipendenze in un oggetto è piuttosto brutto, checkout out Questo articolo .

Definire esplicitamente le tue dipendenze attraverso un costruttore è un approccio molto migliore. Aiuta i test dell'unità e il tempo di esecuzione dei tempi di esecuzione con i servizi che non vengono definiti.

Iniezione del gestore dell'oggetto in a una classe è fondamentalmente iniettando un registro nella tua classe che ha accesso a tutti i servizi delle applicazioni, che ovviamente non è giusta.

Io uso ZF2 Un bit e definitivamente definire le classi di fabbrica piccole per servizi, controller e qualsiasi classe che richiedere dipendenze. Queste classi di fabbrica hanno accesso al localizzatore di servizio e prendi tutti i servizi a cui dipende l'oggetto e li inietta attraverso il costruttore. L'utilizzo di un localizzatore di servizi in una classe di fabbrica va bene poiché è per lo più il codice di lancio, qualcosa come questo per esempio.

Queste fabbriche sono ancora facili da Test < / a>.

IMO, usa l'iniezione del costruttore dove mai possibile. Ancora una volta, non so eccessivamente sull'attuazione di Magento e se ha il concetto di fabbriche, da un aspetto rapido sembra che li sostiene, ma definisce esplicitamente le tue classi e utilizzando un localizzatore di servizi per costruirli in classi di fabbrica un approccio molto più pulito.

Questo è da qualcuno che ha un'esposizione limitata ai suddetti fianchi, quindi vorrei anche ascoltare i pensieri / esperienze degli altri sulla questione!

Più lettura

Un altro modo da usare Helper (in Modelli) è:

$this->helper('[Vendor]\[Module]\Helper\[Helper Name]')->getMethodName();
.

Spero sia utile se non lo sapessi già.

Anche se è una vecchia domanda, non sono sicuro se Marius ha avuto la sua risposta. Credo che Marius può rispondere meglio. Mi piacerebbe risponderlo in breve. Perché Magento 2 suggerisce di usare di invece di aiutante?

    .
  • Realizzazione di isolamento nel test unitario possibile / facile
  • Definizione esplicitamente dipendenze di una classe
  • Facilitare il buon design (principio di responsabilità singola (SRP) per Esempio)
  • Usando di nel tuo modulo riduce il rischio di insetti di incompatibilità quando Magento cambia l'implementazione sottostante di tali interfacce. Questo è un concetto importante da capire per gli sviluppatori di estensione.

    Perché il nucleo M2 potrebbe non utilizzare di in alcuni casi?

      .
    • Numero decrescente di classi
    • non creare interfacce non necessarie
    • Nessun rischio di insetti di incompatibilità

      Anche se il modulo di catalogo principale è stato utilizzato Helper, è stato utilizzato ampiamente. Nella mia ricerca, ho trovato Magento 2 alcune funzioni utilizzate nei file dell helper del catalogo fondamentale che non sono adatti per i contratti di servizio.

      Se è necessario utilizzare esplicitamente una classe definita da magenta (come \ magento \ catalogo \ modello \ prodotto), apportare la dipendenza implicita esplicita dipende dall'implementazione concreta anziché sull'interfaccia del contratto di servizio.

      Indubbiamente, lo sviluppatore di estensione dovrebbe usare DI invece di Magento1 come Helper. Durante l'implementazione secondo le linee guida di Magento 2, il Fallout è limitato. Quando si rompono raccomandazioni, i problemi accadono.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top