Налаштування 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 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