Перепишіть клас Magento 1 в Magento 2 із системою вприскування залежностей


10

Розглядаючи основний код Magento 2 , схоже на те, що стару систему перезапису класу видобули та замінили новою системою введення залежності.

На жаль, для цієї нової системи немає документації .

Хтось має зразок конфігурації модуля, який дозволив би користувачеві в Magento 2 переписати клас Mage_Catalog_Model_Productна новий клас Packagename_Modulename_Model_Product, використовуючи нову систему введення залежності?


Я думав, що Magento 2.0 питань ще не було дозволено meta.magento.stackexchange.com/questions/79/…
Marius

Відповіді:


10

Конфігурація Di була переміщена у файли di.xml, а формат був змінений. Тепер налаштування виглядають приблизно так (di.xml):

<config>
    <preference for="{Interface_Or_Class_Name}" type="{Preferred_Class_Name}" />
</config>

якщо це перезапис класу, чи бажано використовувати плагін замість вузла налаштування?
huzefam

2
Якщо вам потрібно замінити поведінку якогось основного класу, слід скористатися перевагою. Якщо вам потрібно замінити поведінку якогось основного методу, вам слід користуватися плагіном з навколо слухача, який не буде викликати $ proced (). Якщо вам потрібно додати поведінку до якогось основного методу чи класу, слід використовувати плагіни.
Антон Криль

5

Працюючи зсередини назовні, мені вдалося переписати, працюючи з наступним

<global>    
    <di>    
        <preferences>
            <Mage_Catalog_Model_Product>Packagename_Modulename_Model_Product</Mage_Catalog_Model_Product>
        </preferences> 
    </di>
</global>

Однак у впровадженні ін'єкційних залежностей існує набагато більше системного коду, тому незрозуміло, чи буде описано вище в остаточній версії Magento 2.


Тож, здається, вони в основному перейменували "псевдонім" на преференції та перенесли його на вершину? Цікаво. Я з нетерпінням чекаю побачення оновлень документації. Петро сказав, що вони це мають, але все це не було висунуто на сайт документів, принаймні IIRC.
davidalger

5

Ви маєте рацію, переписи класів були повністю усунені та замінені на DI. Наступні примітки наведені з розділу про зміни в Application Framework :

Magento 1.x - Node: / global // {суб-шлях, який відповідає фабричній назви + "переписати" буквально}

<global>
...
    <models>
        <core>
            <rewrite>
                <url>My_Module_Model_Url</url>
            </rewrite>
        </core>
    </models>
...
</global>

Magento 2.x - Вузол: / global / di / псевдоніми

<global>
...
    <di>
        <aliases>
            <Mage_Core_Model_Url>My_Module_Model_Url</Mage_Core_Model_Url>
        </aliases>
    </di>
...
</global>

Я не намагався використовувати це в модулі, який працює в Magento 2.0, але, здається, ви в основному визначаєте псевдонім для імені класу замість того, щоб використовувати складну ієрархію xml для переписування модуля.


1
+1 для сторінки Application Framework, але це не працює в останньому знімку Magento 2, який я схопив.
Алан Шторм
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.