Налаштування Magento 2 використовуються менеджером об'єктів для розширення стандартної логіки. Ви можете використовувати preference в Magento 2 для реалізації певних інтерфейсів або для переписування існуючих PHP класів та їхніх методів.

У цій статті ви дізнаєтеся, як це зробити, і знайдете корисні приклади, які стануть у нагоді.

Переписування класів у Magento 2

Якщо ви хочете переписати існуючі методи класу з Magento preference, виконайте наведені нижче кроки:

1. Створіть файл etc/di.xml у папці розширення:

app/code/MyCompany/ModuleName/etc/di.xml 

2. Додайте до нього наступний код:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Checkout\Block\Onepage\Success" type="MyCompany\ModuleName\Block\Onepage\Success" />
</config>

Використовуйте атрибут "for" в тезі "preference", щоб визначити PHP клас, який потрібно замінити. Використовуйте атрибут "type", щоб визначити PHP клас, який буде використовуватися замість оригінального.

3. Створіть новий файл PHP:

app/code/MyCompany/ModuleName/Block/Onepage/Success.php

з класом MyCompany\ModuleName\Block\Onepage\Success:

<?php
namespace MyCompany\ModuleName\Block\Onepage;

class Success extends \Magento\Checkout\Block\Onepage\Success
{
   // new code here
}

3. Збережіть зміни та виконайте CLI команду:

bin/magento setup:di:compile

Переконайтеся, що команда була виконана без помилок.

Важлива примітка: переписування існуючих класів не рекомендується, оскільки це часто призводить до конфліктів. Конфлікти часто виникали на Magento 1 і досі відбуваються в Magento 2.

Отже, якщо ви все ще хочете використовувати Magento 2 preference для переписування класів, вам потрібен Conflict Detector, який допоможе вам визначити конфлікти класів.

Magento 2 Conflict Detector

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

Реалізація інтерфейсу

Щоб реалізувати інтерфейс у Magento 2, наприклад, інтерфейс вашої нової репозитарії, вам потрібно:

1. Створити файл etc/di.xml у своєму розширенні Magento.

2. Вказати Preference для інтерфейсу та тип класу, який реалізовуватиме інтерфейс, як у прикладі:

<?xml version="1.0"?>
<config>
<preference for="MyCompany\ModuleName\Api\MyEntityRepositoryInterface" type="MyCompany\ModuleName\Model\MyEntityRepository" />
</config>

3. Створити файл Model/MyEntityRepository.php з наступним кодом:

<?php
namespace MyCompany\ModuleName\Model;

use MyCompany\ModuleName\Api\MyEntityRepositoryInterface;

class MyEntityRepository implements MyEntityRepositoryInterface
{
   // class code here
}

4. Зберегти зміни та виконати CLI команду:

bin/magento setup:di:compile