creative/bxmigrate

Bitrix 的迁移

v3.1.4 2021-12-21 09:13 UTC

This package is not auto-updated.

Last update: 2024-09-26 08:07:55 UTC


README

Latest Stable Version License Build Status

为 1C Bitrix 实现控制台迁移。

安装

使用 Composer 进行安装。

在您的项目文件夹中执行以下命令

composer require creative/bxmigrate

描述

迁移将数据库中的任何更改保存到文件中。这允许通过项目存储库传递数据库更改。

迁移由五个元素组成

  1. 迁移对象 - 具有唯一类名对象,它具有应用迁移到数据库的方法 up 和取消迁移到数据库的方法 down,这些方法由想要更改数据库的人实现。

  2. 迁移存储库对象 - 返回包含所有可用迁移的对象数组,允许创建新的迁移。

  3. 迁移状态对象 - 允许检查迁移是否已应用,并标记迁移为应用或取消。

  4. 迁移管理器对象 - 将所有前面的对象工作整合在一起,允许应用迁移、取消、创建新的迁移,为此,它将控制权传递给上述描述中的一个对象。

  5. 通知对象 - 向用户显示迁移执行结果的消息(使用 psr/log 日志接口)。

迁移工作流程算法

首先,需要创建一个控制台脚本,该脚本允许在控制台中使用 1C Bitrix。例如,使用 Symfony console 实现的脚本。

#!/usr/bin/env php
<?php

//Данный файл называется cli.php и расположен на уровень выше document root веб-сервера (папка web).
$_SERVER['DOCUMENT_ROOT'] = realpath(__DIR__ . '/web');
$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];

//Папка с миграциями должна быть создана и находиться рядом с этим скриптом (папка migrations).
define('CLI_MIGRATIONS_PATH', __DIR__ . '/migrations');

//Отключаем сбор статистики, проверку событий и агентов.
define('NO_KEEP_STATISTIC', true);
define('NOT_CHECK_PERMISSIONS', true);
define('CHK_EVENT', true);

//Подключаем загрузку классов composer.
//Файл composer.json расположен на том же уровне, что и данный файл.
//Все зависимости из composer установлены.
require_once __DIR__ . '/vendor/autoload.php';

//Подключаем ядро битрикса.
require $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php';

//Создаем приложение Symfony console.
$application = new \Symfony\Component\Console\Application;

//Регистрируем команды для миграций.
\marvin255\bxmigrate\cli\Factory::registerCommands($application, CLI_MIGRATIONS_PATH);

//Запускаем приложение на исполнение.
$application->run();

脚本创建后,算法与任何其他 PHP 迁移没有区别

  1. 使用命令 php cli.php bxmigrate:create new_migration 创建迁移

  2. migrations 目录下找到名为 migrate_{TIMESTAMP_СОЗДАНИЯ_МИГРАЦИИ}_new_migration.php 的迁移

  3. 实现该迁移的 up 和 down 方法,例如

     <?php
    
     /**
      * Миграция для создания типа инфоблока 'Structure'.
      */
     class migrate_/*TIMESTAMP_СОЗДАНИЯ_МИГРАЦИИ*/_new_migration extends \marvin255\bxmigrate\migrate\Coded
     {
         public function up()
         {
             return $this->IblockTypeCreate([
                 'ID' => 'structure',
                 'SECTIONS' => 'Y',
                 'IN_RSS' => 'N',
                 'SORT' => 500,
                 'EDIT_FILE_BEFORE' => '',
                 'EDIT_FILE_AFTER' => '',
                 'LANG' => [
                     'en' => [
                         'NAME' => 'Structure',
                         'SECTION_NAME' => '',
                         'ELEMENT_NAME' => '',
                     ],
                     'ru' => [
                         'NAME' => 'Структура сайта',
                         'SECTION_NAME' => '',
                         'ELEMENT_NAME' => '',
                     ],
                 ],
             ]);
         }
    
         public function down()
         {
             return $this->IblockTypeDelete('structure');
         }
     }
    
  4. 使用命令 php cli.php bxmigrate:up 在数据库中应用迁移

  5. 如果需要取消最后一个迁移,可以使用命令 php cli.php bxmigrate:down

与库一起提供的命令

  1. bxmigrate:create my_awesome_migration - 创建名为 my_awesome_migration 的迁移文件

  2. bxmigrate:up - 应用所有未应用的迁移

  3. bxmigrate:up 3 - 应用前 3 个未应用的迁移

  4. bxmigrate:up my_awesome_migration - 仅应用名为 my_awesome_migration 的迁移

  5. bxmigrate:down - 取消一个、最后一个按顺序的迁移

  6. bxmigrate:down 3 - 取消最后 3 个按顺序应用的迁移

  7. bxmigrate:down my_awesome_migration - 仅取消名为 my_awesome_migration 的迁移

  8. bxmigrate:refresh my_awesome_migration - 删除名为 my_awesome_migration 的已安装迁移并重新安装。

  9. bxmigrate:check my_awesome_migration - 将名为 my_awesome_migration 的迁移标记为已应用,而不启动迁移本身。

实现特点

  1. 每次迁移之前都会清除 Bitrix 的缓存。

  2. 默认情况下,所有方法 updown 内部的操作都包含在事务中。如果要执行不带事务的迁移,请分别使用方法 unsafeUpunsafeDown

  3. 快速创建迁移。如果迁移名称满足特定的正则表达式,则将直接生成包含实现方法 updown 的迁移文件,这些方法将传递正则表达式从迁移名称中获取的值。快速名称列表

    • /^create_iblock_(.+)_uf_(.+)$/i (create_iblock_news_uf_author) - 为具有指定代码的第二参数的用户属性创建具有指定代码的第一参数的板块。
    • /^update_iblock_(.+)_uf_(.+)$/i (update_iblock_news_uf_author) - 更新具有指定代码的第二参数的用户属性,以第一参数代码的板块。
    • /^delete_iblock_(.+)_uf_(.+)$/i (delete_iblock_news_uf_author) - 删除具有指定第二个参数代码的模块信息块的属性,该属性用于具有指定第一个参数代码的模块信息块。
    • /^create_iblock_(.+)_property_(.+)$/i (create_iblock_news_property_author) - 为指定第一个参数的模块信息块元素创建具有指定第二个参数代码的属性。
    • /^update_iblock_(.+)_property_(.+)$/i (update_iblock_news_property_author) - 更新指定第一个参数的模块信息块元素的属性,该属性具有指定第二个参数代码。
    • /^delete_iblock_(.+)_property_(.+)$/i (delete_iblock_news_property_author) - 删除指定第一个参数的模块信息块元素的属性,该属性具有指定第二个参数代码。
    • /^create_iblock_type_(.+)$/i (create_iblock_type_content) - 创建具有指定第一个参数代码的模块信息块类型。
    • /^delete_iblock_type_(.+)$/i (delete_iblock_type_content) - 删除具有指定第一个参数代码的模块信息块类型。
    • /^create_iblock_(.+)$/i (create_iblock_news) - 创建具有指定第一个参数代码的模块信息块。
    • /^update_iblock_(.+)$/i (update_iblock_news) - 更新具有指定第一个参数代码的模块信息块。
    • /^create_iblock_(.+)$/i (create_iblock_news) - 创建具有指定第一个参数代码的模块信息块。
    • /^install_module_(.+)$/i (install_module_iblock) - 安装具有指定第一个参数代码的模块。
    • /^delete_module_(.+)$/i (delete_module_iblock) - 删除具有指定第一个参数代码的模块。
    • /^create_user_uf_(.+)$/i (create_user_uf_field) - 为具有指定第一个参数代码的用户实体创建用户自定义字段(UF_*)。
    • /^update_user_uf_(.+)$/i (update_user_uf_field) - 更新具有指定第一个参数代码的用户实体的用户自定义字段(UF_*)。
    • /^delete_user_uf_(.+)$/i (delete_user_uf_field) - 删除具有指定第一个参数代码的用户实体的用户自定义字段(UF_*)。
    • /^create_hlblock_(.+)_property_(.+)$/i (create_hlblock_OrderForm_property_number) - 为具有指定第一个参数代码的highload模块实体创建具有指定第二个参数代码的用户自定义属性。
    • /^update_hlblock_(.+)_property_(.+)$/i (update_hlblock_OrderForm_property_number) - 更新具有指定第一个参数代码的highload模块实体具有指定第二个参数代码的用户自定义属性。
    • /^delete_hlblock_(.+)_property_(.+)$/i (delete_hlblock_OrderForm_property_number) - 删除具有指定第一个参数代码的highload模块实体具有指定第二个参数代码的用户自定义属性。
    • /^create_hlblock_(.+)$/i (create_hlblock_OrderForm) - 创建名为指定第一个参数的highload模块实体。
    • /^update_hlblock_(.+)$/i (update_hlblock_OrderForm) - 更新名为指定第一个参数的highload模块实体。
    • /^delete_hlblock_(.+)$/i (delete_hlblock_OrderForm) - 删除名为指定第一个参数的highload模块实体。
    • /^create_email_event_type_(.+)_lid_([^_]+)$/i (create_email_event_type_TEST_MESSAGE_ru) - 创建具有指定第一个参数名称和绑定到第二个参数语言的邮件事件类型。
    • /^update_email_event_type_(.+)_lid_([^_]+)$/i (update_email_event_type_TEST_MESSAGE_ru) - 更新具有指定第一个参数名称和绑定到第二个参数语言的邮件事件类型。
    • /^delete_email_event_type_(.+)_lid_([^_]+)$/i (delete_email_event_type_TEST_MESSAGE_ru) - 删除具有指定第一个参数名称和绑定到第二个参数语言的邮件事件类型。
    • /^create_email_template_(.+)$/i (create_email_template_TEST_MESSAGE) - 为具有指定第一个参数类型的活动创建邮件消息模板。
    • /^update_email_template_(.+)$/i (update_email_template_TEST_MESSAGE) - 更新具有指定第一个参数类型的活动创建的邮件消息模板。
    • /^delete_email_template_(.+)$/i (delete_email_template_TEST_MESSAGE) - 删除具有指定第一个参数类型的活动创建的邮件消息模板。