strong / bitrix-migrations
Bitrix CMS 数据迁移
Requires
- php: >=8.1
- symfony/console: ^5.4
- tightenco/collect: 9.*
Requires (Dev)
- mockery/mockery: ~1
- phpunit/phpunit: ^9.0
- roave/security-advisories: dev-latest
This package is auto-updated.
Last update: 2024-09-16 23:22:46 UTC
README
Bitrix-migrations
Bitrix和其他数据库迁移
安装
-
composer require strong/bitrix-migrations
-
cp vendor/strong/bitrix-migrations/migrator migrator
- 将可执行文件复制到方便的位置。 -
进入并确保设置了正确的 $_SERVER['DOCUMENT_ROOT']。如有需要,请更改设置
-
php migrator install
该命令将在数据库中创建一个表来存储已执行迁移的名称。
默认情况下
-
表名为 migrations。
-
composer.json
和migrator
位于网站根目录。 -
迁移文件将在相对第 2 步复制的文件所在的
./migrations
目录中创建。
如有需要,可以在复制的 migrator
文件中更改这些设置。
- 强烈建议通过 Web 服务器使
migrator
和./migrations
目录不可通过 http 访问。 *
使用方法
工作流程
工作流程通过控制台进行,简要描述如下
- 使用
php migrator make 名称_迁移
创建迁移文件(或多个文件)
迁移文件是一个包含两个方法 up()
和 down()
的类
-
在
up()
方法中实现对数据库的必要更改。如有需要,在down()
方法中实现撤销这些更改 -
应用现有的迁移 -
php migrator migrate
-
将迁移文件添加到版本控制系统,以便在其他机器上运行
可用命令
可以在控制台使用 php migrator list
获取可用命令列表
迁移模板
由于通过 Bitrix API 改变 Bitrix 数据库结构是一项非常不愉快的工作,因此存在迁移模板机制,其工作方式如下:在生成迁移文件时,可以指定其模板:php migrator make 名称_迁移 -t add_iblock
其中 add_block
是模板名称。这将生成一个具有模板模板的类,只需指定细节(例如名称和代码信息块)即可。可以直接通过在 migrator
文件中使用 TemplateCollection::registerTemplate()
添加自己的迁移模板。
现有模板
php migrator status
- 显示可执行迁移以及最后执行的迁移。
自动创建迁移
另一个杀手级特性是自动创建迁移模式。要启用此模式,需要将以下内容添加到 init.php
Arrilot\BitrixMigrations\Autocreate\Manager::init($_SERVER["DOCUMENT_ROOT"].'/migrations');
在 Manager::init()
方法中传递与 migrator
文件中配置相似的目录路径。
之后,在管理员界面执行一系列操作时将发生以下情况
-
触发 Bitrix 事件处理器
-
创建迁移文件,就像执行
php migrator make
一样 -
标记迁移为已应用
-
显示有关先前步骤的通知
启用此模式可以消除许多情况下手动编写迁移的需要。在自动创建的迁移中不需要进行任何修改。
处理事件列表
- 迁移使用事件
OnBefore...
。如果您的更改发生错误(例如,在添加信息块时未指定网站绑定),则会显示有关已创建迁移的通知,您需要手动使用php migrator rollback --hard --delete
执行此类迁移。 *
处理迁移错误
要取消迁移,只需抛出异常 - php throw new MigrationException('这里错误文本');
在这种情况下,迁移和随后的迁移都不会应用。
在 Bitrix 外部使用
此包是为与 Bitrix 一起使用而创建的,但它在其他系统中也很容易使用。要实现这一点,需要在 migrator
文件中。
-
将Bitrix的内核连接替换为其他系统的内核。
-
实现自己的类似
Arrilot\BitrixMigrations\Repositories\BitrixDatabaseRepository;
的副本并使用它。 -
如有需要,可以关闭现有的迁移模板,制作自己的。