Переписать класс 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
Если вам нужно заменить поведение некоторого базового класса, вы должны использовать предпочтения. Если вам нужно заменить поведение какого-либо основного метода, вы должны использовать плагин со слушателем вокруг, который не будет вызывать $ progress (). Если вам нужно добавить поведение в какой-либо основной метод или класс, вы должны использовать плагины.
Антон Крыль,
5

Работая изнутри, я смог переписать, работая со следующими

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

Однако в реализации внедрения зависимостей намного больше системного кода, поэтому неясно, сработает ли вышеперечисленное в окончательной версии Magento 2.

Алан Сторм
источник
Таким образом, кажется, что они в основном переименовали «псевдоним» в настройках и переместили его в топ? Интересно. Я с нетерпением жду появления обновлений документации. Питер сказал, что они есть, но все это не было отправлено на сайт документации, по крайней мере, IIRC.
Дэвидгер
5

Вы правы, переписывание классов было полностью исключено и заменено на DI. Следующие примечания относятся к разделу об изменениях в Application Framework :

Magento 1.x - Узел: / global // {подпуть, соответствующий имени фабрики + литерал "rewrite"}

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

Magento 2.x - Узел: / global / di / aliases

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

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

davidalger
источник
1
+1 для страницы Application Framework, но это не работает в последнем снимке Magento 2, который я получил.
Алан Сторм