genkgo / migrations

1.4.0 2024-09-02 17:49 UTC

This package is auto-updated.

Last update: 2024-09-02 17:51:26 UTC


README

一个简化迁移操作的库。

安装

需要PHP 8.0或更高版本。可以通过Composer安装和自动加载,作为 genkgo/migrations

质量

在命令行中运行单元测试,请输入 vendor/bin/phpunit -c phpunit.xml。需要 PHPUnit

此库试图遵守 PSR-1PSR-2PSR-4。如果您注意到有不符合规范的地方,请通过pull request发送补丁。

入门指南

创建迁移文件

创建迁移文件,定义如何更新和撤销对应用程序的更改。

<?php
use Genkgo\Migrations\AbstractMigration;

class migration_2014_11_13_11_55 extends AbstractMigration
{

    public function up()
    {
        // your changes here
    }

    public function down()
    {
        // undo changes here
    }
}

迁移

适配器会保存已执行迁移的历史记录。当前库自带MySQL和Sqlite适配器。要添加新适配器,请创建自己的适配器并提交pull request。设置适配器,创建新列表(从目录中的文件列表中创建)并执行。

<?php
use PDO;
use Genkgo\Migrations\Factory;
use Genkgo\Migrations\Adapters\PdoSqliteAdapter;

$adapter = new PdoSqliteAdapter(new PDO('sqlite::memory:'));
$factory = new Factory($adapter);
$directory = __DIR__.'/migrations';
$list = $this->factory->newListFromDirectory($directory);
$result = $list->migrate();

注入依赖

您可以注入自己的依赖项,例如以下示例中的某些数据库抽象层。

<?php
use PDO;
use Genkgo\Migrations\Factory;
use Genkgo\Migrations\Adapters\PdoSqliteAdapter;
use Vendor\DatabaseAbstractLayer\SchemaGenerator;

$adapter = new PdoSqliteAdapter(new PDO('sqlite::memory:'));
$factory = new Factory($adapter, function ($classname) {
    return new $classname(new SchemaGenerator());
});

然后在迁移文件中使用它。

<?php
use Genkgo\Migrations\AbstractMigration;
use Vendor\DatabaseAbstractLayer\SchemaGenerator;

class migration_2014_11_13_11_55 extends AbstractMigration
{
    private $schema;

    public function __construct(SchemaGenerator $schema) {
        $this->schema = $schema;
    }

    public function up()
    {
        // your changes here
    }

    public function down()
    {
        // undo changes here
    }
}

以下示例使用 Aura.Di的自动参数值解析

<?php
use PDO;
use Genkgo\Migrations\Factory;
use Genkgo\Migrations\Adapters\PdoSqliteAdapter;

$adapter = new PdoSqliteAdapter(new PDO('sqlite::memory:'));
$factory = new Factory($adapter, function ($classname) use ($di) {
    return $di->newInstance($classname);
});

多个列表

您可以有多个迁移列表,例如为每个插件一个列表。只需将迁移文件放入正确的命名空间。请参见以下示例。

<?php
namespace Vendor\MyPlugin;

use Genkgo\Migrations\AbstractMigration;

class migration_2014_11_13_11_55 extends AbstractMigration
{

    public function up () { }
    public function down () { }

}

然后进行迁移。

$directory = __DIR__. '/migrations';
$list = $this->factory->newListFromDirectory($directory,'Vendor\\Plugin\\');
$list->migrate();

贡献

  • 发现了一个错误?请先尝试自己解决它并提交pull request。如果您无法修复它,至少提供清晰的错误描述。当有时间时我们会查看。
  • 想要添加功能吗?提交pull request并看看会发生什么。您还可以提交缺少功能的错误报告,我们可以讨论如何实现它。