Magento 2: Który mechanizm rozszerzenia wybrać?

9

Możemy rozszerzyć kontroler na dwa sposoby: używając preferencji i wtyczki. Ale nie rozumiem tego, który z nich jest dobry i jakie są zalety / wady preferencji w porównaniu do wtyczki.

<preference for="Magento\Checkout\Controller\Index\Index" type="mymodule\Helloworld\Controller\Index\Index" />

<type name="Magento\Catalog\Model\Product">
    <plugin name="getname-test-module" type="mymodule\Helloworld\Model\Plugin\Product" sortOrder="10"/>
</type>
Anand Ontigeri
źródło
Możliwy duplikat Magento 2: Plugin vs Observer
7ochem

Odpowiedzi:

11

W miarę możliwości używaj wtyczek, a następnie obserwatorów (zobacz zalety i wady każdego z nich ), pozwoli to uniknąć konfliktów z innymi rozszerzeniami (moduły stron trzecich).

Preferencji należy używać tylko wtedy, gdy całą podstawową implementację klasy / interfejsu należy zastąpić niestandardową. Weź pod uwagę, że tylko jedna preferencja jest aktywna w dowolnym momencie (która jest zdefiniowana przez sekwencję zdefiniowaną w module.xml), więc jeśli inne rozszerzenie zdefiniuje preferencje dla tej samej klasy / interfejsu, wystąpi konflikt (te rozszerzenia nie mogą ze sobą współpracować).

Alex Paliarush
źródło
4
  • Jeśli twoja funkcjonalność całkowicie zastąpi podstawową funkcjonalność, możesz użyć preferencji.
  • Jeśli chcesz dodać funkcjonalność do bazy lub częściowo zastąpić metodę klasy, skorzystaj z wtyczek.
KAndy
źródło
1
Rozsądnie jest zauważyć, że jeśli zastąpisz podstawową funkcjonalność, to na Tobie spoczywa ciężar monitorowania podstawowych aktualizacji i upewnienia się, że moduły niestandardowe są aktualne
Robbie Averill,
1

dodatkowe informacje: prawie wszystkie preferencje używane w stażu m2 służą tylko do zachowania relacji między podstawową klasą betonu a interfejsem, na przykład:

<preference for="Magento\Store\Model\StoreManagerInterface" type="Magento\Store\Model\StoreManager" />

w twoim przypadku jest on używany raz:

<preference for="Magento\ImportExport\Controller\Adminhtml\Export\GetFilter" type="Magento\AdvancedPricingImportExport\Controller\Adminhtml\Export\GetFilter" />
Ibnab
źródło