РАЗРАБОТКА НА БИТРИКС

Миграции в БД с помощью библиотеки arrilot/bitrix-migrations

Подписывайтесь на канал для bitrix-разработчиков в Telegram!

Введение

В данном кейсе будет рассмотрена библиотека миграций для «Битрикс», которая позволяет переносить изменения БД между нескольким копиями проекта.

Описание задачи

При разработке проекта возникает потребность в поддержании актуальности базы данных на всех развернутых копиях проекта. Монотонность наполнения БД новыми инфоблоками, свойствами и т. д. может привести к ненужным тратам времени и ошибкам.
Для решения перечисленных проблем существует библиотека миграций arrilot/bitrix-migrations, которая очень проста в использовании. Также, если есть заготовленный список миграций для привычных изменений в БД при создании сайта, то их нужно только применить, что сэкономит вам кучу времени. Например, создание свойств заказа и групп свойств заказа, групп пользователя, аккаунта для контент-менеджера с выделенными правами, типов плательщика, шаблона сайта и т. д.

Исходные данные

Существует несколько копий проекта:
  1. Локальные сайты
  2. Релизный сайт
  3. Боевой сайт
На проекте используется Composer. Если его нет, то нужно установить.

Решение задачи

Установка

  1. Добавим необходимый пакет в composer и установим:

composer require arrilot/bitrix-migrations
После установки библиотеки добавится исполняемый файл миграций migrator. Необходимо удостовериться, что в файле задается правильное значение $_SERVER['DOCUMENT_ROOT'].
2. Создаем в БД таблицу migrations для хранения названий выполненных миграций :

php migrator install
3. Незакоммиченные правки файлов композера и новый файл migrator необходимо внести под контроль версий, чтобы другие разработчики могли поставить библиотеку на свою копию проекта.
4. После подключения библиотеки на проекте разработчик должен на локальной копии вытянуть актуальную ветку master, установить пакеты composer и выполнить команду пункта 2, создав таблицу.
Если разработчик развернул проект, где уже используется данная библиотека, то действий по установке не требуется.

Применение миграций

Важно! При отправке кода с миграцией на релиз или бой, применение миграций нужно выполнить вручную, если команда выполнения миграции не прописана в скрипте для деплоя.
Процесс создания и отката миграций происходит через консоль.
  • Создать миграцию.

php migrator make migration_name
Вместо migration_name укажите название миграции. Слишком длинные названия лучше не делать, так как к нему прибавится дата и время создания файла.
Созданная миграция без использования шаблона будет иметь вид:

<?php

use Arrilot\BitrixMigrations\BaseMigrations\BitrixMigration;
use Arrilot\BitrixMigrations\Exceptions\MigrationException;

class TestMigration20230721161152182831 extends BitrixMigration
{
   /**
    * Run the migration.
    *
    * @return mixed
    * @throws \Exception
    */
   public function up()
   {
       //
   }


   /**
    * Reverse the migration.
    *
    * @return mixed
    * @throws \Exception
    */
   public function down()
   {
       //
   }
}
В методе up() пишется код, который необходимо исполнить при выполнении миграции. В методе down() пишется код, который необходимо исполнить при откате миграции.
Готовую миграцию нужно добавить под контроль версий.
  • Посмотреть все непримененные миграции.

php migrator status
  • Выполнить миграцию.

php migrator migrate
Если у вас есть несколько миграций, которые еще не применялись, то команда исполнит их все сразу.
  • Откатить миграцию.

php migrator rollback
Команда откатит последнюю примененную миграцию. Чтобы откатить предыдущую, нужно выполнить команду еще раз.
  • Создать миграцию, используя готовый шаблон.
Например, если нужно создать инфоблок, то можно воспользоваться командой:

php migrator make new_ib_test -t add_iblock
где new_ib_test - название миграции, add_iblock - шаблон
Данная команда создаст следующую миграцию:

<?php

use Arrilot\BitrixMigrations\BaseMigrations\BitrixMigration;
use Arrilot\BitrixMigrations\Exceptions\MigrationException;

class NewIbTest20230721163328531029 extends BitrixMigration
{
   public function up()
   {
       $ib = new CIBlock;


       $iblockId = $ib->add([
           'NAME' => '__',
           'CODE' => '__',
           'SITE_ID' => 's1',
           'IBLOCK_TYPE_ID' => '__', //символьный код группы инфоблока,
           'VERSION' => 2,
           'GROUP_ID' => ['2' =>'R'],
           'LIST_PAGE_URL' => '__',
           'DETAIL_PAGE_URL' => '__',
       ]);


       if (!$iblockId) {
           throw new MigrationException('Ошибка при добавлении инфоблока '.$ib->LAST_ERROR);
       }


       // свойства
       $propId = $this->addIblockElementProperty([
           'NAME' => '__',
           'SORT' => 500,
           'CODE' => '',
           'PROPERTY_TYPE' => 'L', // Список
           'LIST_TYPE' => 'C', // Тип списка - 'флажки'
           'VALUES' => [
               'VALUE' => 'да',
           ],
           'MULTIPLE'  => 'N',
           'IS_REQUIRED' => 'N',
           'IBLOCK_ID' => $iblockId
       ]);
   }

   public function down()
   {
       $this->deleteIblockByCode('__');
   }
}
Шаблон миграций
Посмотреть весь список шаблонов и их описание можно в терминале, выполнив команду:

php migrator templates

Примеры миграций, наиболее часто используемые:

  • Создание свойств заказа.
  • Создание инфоблока.
  • Создание почтового шаблона.
  • Создание оплаты.
  • Создание статуса заказа.

Вывод

Как видно, миграции существенно упрощают процесс поддержки и создания проектов. Минус данной библиотеки в том, что она больше не поддерживается.

Дополнительный материал

Ссылка на оригинальную статью библиотеки: https://github.com/arrilot/bitrix-migrations
Подписывайтесь на канал для bitrix-разработчиков в Telegram!

Рекомендованные статьи