netbrothers-gmbh / version-bundle
基于 MariaDB/MySQL 和 Doctrine 触发的版本表
Requires
- php: >=8.2
- doctrine/dbal: ^3.8
- doctrine/orm: *
- symfony/console: >=7 <8
Requires (Dev)
- phpstan/phpstan: ^1.9
- phpstan/phpstan-deprecation-rules: ^1.0
README
NetBrothers 版本包
这个混合包可以作为 Symfony 包 或作为独立 PHP 包,用于在 MariaDB 和 MySQL 数据库中管理版本化表。它使用 Doctrine ORM 与您的数据库进行交互。
注意:此包旨在与 MariaDB/MySQL 一起使用。它**不**考虑与其他 RDBMS 一起使用。
本质上,此包提供了一项命令,该命令执行两项操作。
-
创建版本表
对于具有名为version的列、类型为INT/BIGINT的表(例如orig_table),脚本将创建相应的版本表(例如orig_table_version),以便原始表和版本表在结构上相同。 -
创建版本触发器
对于每个版本化的原始表,脚本将创建一个触发器,该触发器将在INSERT和UPDATE操作中增加版本列中的版本号,并将行的副本保存到版本表中。
安装
在命令提示符下,切换到您项目的根目录并执行
composer require netbrothers-gmbh/version-bundle
有三种安装方式
独立包
无需进一步安装步骤。
带有 Flex 的 Symfony 包
无需进一步安装步骤。Symfony Flex 会自动将包注册到 config/bundles.php。
不带 Flex 的 Symfony 包
您需要通过将包添加到项目中的注册包列表来启用它,在文件的 config/bundles.php 中。
// config/bundles.php return [ // ... NetBrothers\VersionBundle\NetBrothersVersionBundle::class => ['all' => true], // ... ];
配置
Symfony 包
将包的 netbrothers_version.yaml 文件从包的 install 文件夹复制到您的 Symfony 项目的配置路径。
Doctrine 迁移
如果您使用 Doctrine Migrations,请通过使用/自定义 模式过滤器 选项来指示它忽略您的版本表。如果您没有其他模式过滤器,您可以使用这个:schema_filter: ~(?<!_version)$~。请参见示例文件了解如何操作。
注意:如果您不过滤您的版本表,Doctrine 可能会在下一个机会中删除它们。
包配置
您可以在创建版本时指定某些列(按名称)始终由比较算法忽略。请参见示例文件 netbrothers_version.yaml 了解如何操作。
独立
在大多数PHP框架中,您将有一个用于管理依赖项的PSR-11兼容容器。您需要通过文件参数将此容器提供给脚本。
vendor/bin/netbrothers-version --container-file=config/container.php --summary
脚本将检查提供的容器是否实现了PSR-11 ContainerInterface。如果是,它将假设通过标识符EntityManagerInterface::class使用Doctrine EntityManagerInterface的实例。以下是一个检查容器文件是否正常工作的示例。
<?php require_once '/path/to/vendor/autoload.php'; use Psr\Container\ContainerInterface; use Doctrine\ORM\EntityManagerInterface; $container = require '/path/to/your/container-file.php'; if ( $container instanceof ContainerInterface && $container->get(EntityManagerInterface::class) instanceof EntityManagerInterface ) { // everything is fine } else { // you need to check your container file }
在独立模式下,忽略表和列由命令行选项控制。
vendor/bin/netbrothers-version \ --container-file=config/container.php \ --ignore-table=unversioned_table_one \ --ignore-table=unversioned_table_two \ --exclude-column=unversioned_column_one \ --exclude-column=unversioned_column_two \ --create-trigger
用法
准备您的实体/原始表
为要版本化的每个表添加一个名为version(类型INT/BIGINT)的列。这可以通过将VersionColumn特质添加到您的实体中,然后创建并应用迁移来完成。
创建版本表和触发器
执行以下命令。
# Symfony bin/console netbrothers:version # Standalone vendor/bin/netbrothers-version --container-file=config/container.php
对于每个具有version-列的表,该命令将
- 创建相应的版本表(如果尚不存在),
- 比较两个表中的列,并修改版本表以匹配原始表,
- (如果存在)删除旧版本触发器,
- (在任何情况下)创建版本触发器。
为单个表创建版本表和触发器
如果需要,您可以将版本化应用于单个表。这可以通过将表名作为控制台命令的参数提供来完成。
# Symfony bin/console netbrothers:version [<tableName>] # Standalone vendor/bin/netbrothers-version --container-file=config/container.php [<tableName>]
命令行选项
版本命令提供以下选项(子命令)。
许可证
MIT