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