Magento2: qual è la differenza di base tra plugin e preferenze?


47

Ho usato sia il plugin che le preferenze nel tutorial di magento2 ed entrambi funzionano bene, ma qual è la differenza fondamentale tra loro.

Codice per plugin:

1.1) Aggiungi una dichiarazione di plugin in di.xml:

<type name="Magento\Catalog\Model\Product">
<plugin name="magento-catalog-product-plugin" type="Training\Test\Model\Product" sortOrder="10"/>
</type>

1.2) Creare una classe plugin:

<?php
namespace Training\Test\Model;
class Product {
public function afterGetPrice(\Magento\Catalog\Model\Product $product, $result) {
return 5;
}
}

Codice per preferenza:

2.1) Creare una dichiarazione di preferenza:

<preference for="Magento\Catalog\Model\Product"
type="Training\Test\Model\Testproduct" />

2.2) Creare una nuova classe di prodotti:

<?php
namespace Training\Test\Model;
class Testproduct extends \Magento\Catalog\Model\Product
{
public function getPrice() {
return 3;
}
}

Risposte:


59

Una preferenza equivale alla riscrittura di classe da Magento 1. Equivale a dire "Ogni volta che il codice lo richiede ClassA, dai loro MyClassBinvece". MyClassBdovrebbe essere un'implementazione completa di ClassA, oltre a qualsiasi comportamento si aggiunga o modifichi in cima.

Come in Magento 1, solo una preferenza (riscrittura) può essere attiva per una classe alla volta a meno che non le si incatenano manualmente (in modo che si MyClassBestenda OtherClassBe si OtherClassBestenda ClassA).

Un plugin ti consente di eseguire il codice prima, intorno o dopo i metodi della classe su cui ti stai collegando. La tua classe plugin non sostituisce la classe target e non ne è un'istanza. Devi solo metodi before{method}, around{method}, after{method}che vengono eseguiti al momento opportuno in relazione al metodo {} sulla classe di destinazione.

Poiché i plug-in non sostituiscono la classe target, qualsiasi numero di plug-in può essere attivo contemporaneamente su una classe. Magento li esegue uno dopo l'altro in base al parametro sortOrder nel tuo XML.

Per questo motivo, i plugin sono molto più flessibili delle preferenze. Dovresti usare plugin ogni volta che è possibile ed evitare le preferenze per riscrivere le classi se non assolutamente necessario.

Puoi leggere di più su come funzionano i plugin e su come usarli nella documentazione ufficiale .


La preferenza non equivale alla riscrittura di classe. È un modo per fornire un'implementazione predefinita per le interfacce.
KAndy,

1
@KAndy Questo potrebbe essere lo scopo di base previsto, ma un effetto collaterale di ciò è che funzionano anche per il superamento della classe. Semanticamente sono gli stessi. La riscrittura di classe tramite le preferenze è ciò di cui Yogesh stava chiedendo, e anche ciò su cui l'esercizio dei Fondamenti a cui stava lavorando ti insegna a fare.
Ryan Hoerr,

12

In parole semplici

La preferenza viene utilizzata per la classe principale

Il plug-in viene utilizzato per aggiungere funzionalità prima, dopo e intorno ai metodi.

Per il tuo esempio:

<preference for="Magento\Catalog\Block\Product\ListProduct" type="Vendor\MyModule\Block\Product\ListProduct" /> 

Ogni volta che il codice chiede ListProduct, la preferenza lo dice

Ehi, usa Vendor\MyModule\Block\Product\ListProduct invece di Magento\Catalog\Block\Product\ListProduct

<type name="Magento\Catalog\Model\Product">
<plugin name="magento-catalog-product-plugin" type="Training\Test\Model\Product" sortOrder="10"/>
</type>

Ogni volta che il codice richiede getPrice (), il plugin lo ha detto

Ehi usa il mio getPrice() metodo prima, dopo e intorno al tuo getPrice() metodo


1

In breve :

La preferenza viene utilizzata per specificare l'implementazione predefinita di un'interfaccia.

Plugin (Interceptor) viene utilizzato per estendere il comportamento di un metodo pubblico di un'altra classe.

In dettaglio :

Preferenza: se esiste più di una classe che implementa un'interfaccia, è importante specificare quella predefinita di tutte le classi implementate. Questo viene fatto tramite il nodo delle preferenze nel file di iniezione delle dipendenze (di.xml).

Esempio :

<preference for="Magento\Catalog\Block\Product\ListProduct" type="Vendor\MyModule\Block\Product\ListProduct" /> 

Questa mappatura è attiva app/etc/di.xml, quindi il gestore oggetti inietta la Magento\Core\Model\Urlclasse di implementazione ovunque sia presente una richiesta per Magento\Core\Model\UrlInterfacenell'ambito globale.

Plugin (intercettore):

Supponiamo che una classe Aabbia un metodo methodAche richiede una funzionalità estesa. Quindi, ciò viene ottenuto tramite Plugin creando classe APluginsenza modificare la classe originale A. La classe APluginha metodi che vengono eseguiti prima, dopo o attorno al metodo richiesto.

Esempio :

<config>
    <type name="Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStock">
        <plugin name="showOutOfStockValueChanged" type="Magento\Catalog\Model\Plugin\ShowOutOfStockConfig"/>
    </type>
</config>

Questa mappatura è in app / etc / di.xml. Uno / Pochi dei Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStockmetodi di classe vengono eseguiti prima / dopo / attorno ai Magento\Catalog\Model\Plugin\ShowOutOfStockConfigmetodi di classe .

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.