Переопределение класса прокси в Magento 2

8

Мне нужно переопределить класс \Magento\Catalog\Model\Product\Linkс помощью предпочтения, который работает нормально, но вышеупомянутый класс имеет прокси-класс, сгенерированный автоматически \Magento\Catalog\Model\Product\Link\Proxy, который не включает новые методы, добавленные в переопределение. Есть ли способ, которым мы можем внедрить эти методы в прокси-класс?

РЕДАКТИРОВАТЬ

Я попытался разобраться с этим и обнаружил, что мы можем внедрить прокси с помощью di.xml. Но когда я попытался сделать это, я получил исключение, что класс Package\Module\Model\Class\Proxyне существует. Это означает, что новый прокси, который я пытаюсь сгенерировать, не генерируется автоматически.

Тарал Патолия
источник
Тарал, твой экземпляр Magento переведен в режим разработчика? Если нет, вам нужно скомпилировать di для генерации прокси.
Иван Чепурный
Почему вы добавляете методы в этот класс?
Кэнди
Иван, мой экземпляр
magento
@ Kandy Мне нужно добавить точную функциональность в качестве связанных продуктов, поэтому для этого мне нужно добавить несколько методов для нового типа ссылки. как я заметил, у каждого типа ссылки (related, cross_sell, up-sell) есть свои методы в этом классе.
Тарал Патолия
вы не можете просто создать прокси - класс вручную и набор в di.xmlпредпочтении \Magento\Catalog\Model\Product\Link\Proxyк Package\Module\Model\Class\Proxy?
Мариус

Ответы:

5

Прочитав комментарии, в которых вы указали:

Я сделал подобное, и это сработало. Я согласился с этим решением. но я хотел создать новый прокси-класс, в который были включены новые методы. В качестве прокси-класса используется для уменьшения загрузки инициализации класса. теперь, когда прокси-класс больше не используется, исходный класс будет больше загружаться сервером. но я думаю, что это незначительно.

Вся проблема, которую вы пытаетесь решить, может быть выполнена более элегантно и менее болезненно.

Если вы просто добавили новые методы в существующую реализацию, это означает, что вы не меняете поведение исходного класса.

  1. Вы должны избегать расширения открытых методов существующего класса в пользу создания своего собственного класса, который использует оригинальный в качестве зависимости
  2. Затем передайте свой класс в том месте, где вы использовали оригинальный

Это дает вам такие дополнительные преимущества:

  1. Вы пишете код проще для его тестирования (одиночная зависимость вместо пересмотра всех основных зависимостей)
  2. Это не нарушает принцип единой ответственности
  3. Это не влияет на ядро ​​в местах, которые вы не ожидаете
  4. Это отделяет вашу бизнес-логику от базовой реализации
Иван Чепурный
источник
2

Мне удалось создать правильный Proxy.phpфайл, который включал мою новую функцию, добавив следующее в мой модульdi.xml

<type name="Magento\Catalog\Model\Product">
    <arguments>
        <argument name="productLink" xsi:type="object">Package\Module\Model\Product\Link\Proxy</argument>
    </arguments>
</type>

Спасибо @minlare за помощь

BroopDias
источник