marvin255 / bxmigrate
Миграции для битрикс
Installs: 4 174
Dependents: 1
Suggesters: 0
Security: 0
Stars: 6
Watchers: 2
Forks: 2
Open Issues: 1
Requires
- php: >=5.4
- psr/log: ~1.0
- symfony/console: ~2.8 || ~3.2
Requires (Dev)
- friendsofphp/php-cs-fixer: ~2.2
- phpunit/phpunit: ~4.8
This package is auto-updated.
Last update: 2019-08-02 07:18:45 UTC
README
Реализация консольных миграций для 1С Битрикс.
Установка
Устанавливается с помощью Composer.
Выполните команду в папке вашего проекта:
composer require marvin255/bxmigrate:~3.0
Описание
Миграции фиксируют какое-либо изменение в базе данных в файл. Это позволяет передавать изменения базы данных через репозиторий проекта.
Миграции состоят из пяти элементов:
-
Объект миграции - объект с уникальным именем класса, который имеет метод up для применения миграции в базе данных и метод down для отмены миграции в базе данных, эти методы реализует тот, кто хочет внести изменения в базу данных.
-
Объект хранилища миграций - возвращает массив с объектами всех доступных миграций, позволяет создать новую миграцию.
-
Объект статуса миграций - позволяет проверить применена ли миграция и пометить миграцию примененной или отмененной.
-
Объект менеджера миграций - связывает работу всех предыдущих объектов воедино, позволяет применить миграции, отменить, создать новую, для этого он передает контроль одному из описанных выше объектов.
-
Объект-нотификатор - выводит сообщения о результатах выполнения миграций пользователю (использует интерфейс логгера psr/log).
Алгоритм работы с миграциями
Прежде всего, нужно создать консольный скрипт, который позволит использовать 1С Битрикс в консоли. Пример реализации такого скрипта с использованием 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:
-
создать миграцию с помощью команды
php cli.php bxmigrate:create new_migration
, -
в каталоге
migrations
найти миграцию с именемmigrate_{TIMESTAMP_СОЗДАНИЯ_МИГРАЦИИ}_new_migration.php
, -
реализовать методы 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'); } }
-
Применить миграцию в базе данных с помощью команды
php cli.php bxmigrate:up
, -
В случае необходимости отменить последнюю миграцию можно с помощью команды
php cli.php bxmigrate:down
.
Команды, предоставляемые вместе с библиотекой
-
bxmigrate:create my_awesome_migration
- создать файл для миграции с именемmy_awesome_migration
, -
bxmigrate:up
- применить все непримененые миграции, -
bxmigrate:up 3
- применить 3 первых по порядку не примененных миграции, -
bxmigrate:up my_awesome_migration
- применить только миграцию с именемmy_awesome_migration
, -
bxmigrate:down
- отменить одну, последнюю по порядку, миграцию, -
bxmigrate:down 3
- отменить 3 последних по порядку примененных миграции, -
bxmigrate:down my_awesome_migration
- отменить только миграцию с именемmy_awesome_migration
, -
bxmigrate:refresh my_awesome_migration
- удаляет установленную миграцию с именемmy_awesome_migration
и устанавливает заново. -
bxmigrate:check my_awesome_migration
- помечает миграцию с именемmy_awesome_migration
примененной без запуска самой миграции.
Особенности реализации
-
Кэш Битрикса очищается каждый раз до миграции.
-
По умолчанию все действия внутри методов
up
иdown
обернуты в транзакцию. Для выполнения миграции без транзакций нужно использовать методыunsafeUp
иunsafeDown
соответственно. -
"Быстрое" создание миграций. Если название миграции будет удовлетворять определенному регулярному выражению, то файл миграции будет сформирован сразу с реализованными методами
up
иdown
, в которые будут переданы те значения, которые получит регулярное выражение из названия миграции. Список "быстрых" названий:/^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
) - Удаляет шаблон почтового сообщения для события с типом, указанном в первом параметре.