Заплатки данных и схемы
Заплатка (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 и не запускает его снова; на сервере коллеги и на рабочем сайте останутся старые данные. Для каждого нового изменения пишите новую заплатку.