Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Заплатки данных и схемы

Заплатка (patch) — класс, который один раз вносит изменение в базу данных при запуске setup:upgrade. Заплатками добавляют начальные записи, настройки и атрибуты. Magento запоминает выполненные заплатки и повторно их не запускает — так на всех серверах оказываются одинаковые данные.

Где лежат заплатки

Папка модуляЧто в ней
Setup/Patch/DataЗаплатки данных: добавление и изменение записей
Setup/Patch/SchemaЗаплатки схемы: изменения структуры, которые нельзя описать в db_schema.xml

Команды для создания нет — файл пишут вручную. Имя класса должно говорить, что он делает.

app/code/Acme/Hello/
└── Setup/
    └── Patch/
        └── Data/
            └── AddSampleReviews.php    новый файл

Заплатка данных

Добавим в таблицу отзывов две записи, чтобы на странице /hello было что показать:

// app/code/Acme/Hello/Setup/Patch/Data/AddSampleReviews.php
namespace Acme\Hello\Setup\Patch\Data;
 
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\Patch\DataPatchInterface;
 
class AddSampleReviews implements DataPatchInterface
{
    public function __construct(private ModuleDataSetupInterface $setup) {}
 
    public function apply(): self
    {
        $this->setup->getConnection()->insertMultiple(
            $this->setup->getTable('acme_hello_review'),
            [
                ['product_id' => 1, 'author' => 'Анна', 'rating' => 5, 'content' => 'Отличная сумка'],
                ['product_id' => 1, 'author' => 'Иван', 'rating' => 4, 'content' => 'Удобная, но маркая'],
            ],
        );
 
        return $this;
    }
 
    public static function getDependencies(): array
    {
        return [];
    }
 
    public function getAliases(): array
    {
        return [];
    }
}

Метод apply() выполняет работу, два других метода обязательны по интерфейсу. Метод getTable() возвращает имя таблицы с учётом приставки, заданной при установке. Если вы добавили внешний ключ из урока о схеме, товар с номером 1 должен существовать — он есть в демонстрационных данных.

Запуск

bin/magento setup:upgrade

Команда выполнит заплатку, и на странице /hello появятся два отзыва. При следующих запусках setup:upgrade заплатка пропускается.

Как Magento помнит заплатки

Имена выполненных заплаток хранятся в таблице patch_list. Чтобы при разработке запустить заплатку ещё раз, удалите её строку из этой таблицы и снова выполните setup:upgrade. На рабочем сервере так не делают.

Порядок выполнения

Если заплатке нужны данные другой заплатки, её класс перечисляют в getDependencies():

// app/code/Acme/Hello/Setup/Patch/Data/AddMoreReviews.php
public static function getDependencies(): array
{
    return [AddSampleReviews::class];
}

Magento сначала выполнит AddSampleReviews, а затем эту заплатку. Заплатки без зависимостей выполняются в произвольном порядке.

Заплатка схемы

Структуру таблиц описывает db_schema.xml, и почти всегда этого достаточно. Заплатка схемы нужна в редких случаях, например чтобы перенести данные из старого столбца перед его удалением. Она устроена так же, но лежит в Setup/Patch/Schema, реализует Magento\Framework\Setup\Patch\SchemaPatchInterface и получает в конструкторе Magento\Framework\Setup\SchemaSetupInterface.

Что делают заплатками

ЗадачаЧем пользоваться
Начальные записи своих таблицСоединение из ModuleDataSetupInterface
Атрибут товара или покупателяEavSetupFactory — о нём один из следующих уроков
Значение настройкиЗапись в таблицу core_config_data
Страница или блок CMSРепозитории модуля Magento_Cms

Частая ошибка

Заплатку уже выполнили, а потом исправили её код и ждут, что изменения применятся. Magento видит имя класса в patch_list и не запускает его снова; на сервере коллеги и на рабочем сайте останутся старые данные. Для каждого нового изменения пишите новую заплатку.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.