pccomponentes/migration

简单的迁移系统,使用 symfony 控制台命令

v1.1.1 2021-01-19 12:15 UTC

This package is auto-updated.

Last update: 2024-09-19 20:31:58 UTC


README

我们理解迁移是执行所有与基础设施准备相关的任务。例如,在数据库中创建表,修改表,插入初始数据,在消息传递系统中创建队列等。

这个库提供了通过控制台命令执行这些迁移的基础,使用 symfony 组件控制台组件

创建迁移

建议在项目根目录下创建一个 migrations 目录,并为要包含的迁移类型创建一个子目录,例如 mysqlrabbitmq 等。对于每个迁移,创建一个 PHP 文件,声明一个类,按照约定,该类名应与文件名相同。此类 不应在命名空间中

你的迁移类在其构造函数中需要作为依赖的最小必要条件来完成工作。例如,以下是如何创建一个用于创建或删除 ejemlo 表的 \PDO 迁移的示例。它需要实现 Pccomponentes\Migration\Migration 接口,并包含要执行的任务。

<?php
declare(strict_types=1);

use Pccomponentes\Migration\Migration;

class PdoMigration implements Migration
{
    private $connection;

    public function __construct(\PDO $connection)
    {
        $this->connection = $connection;
    }

    public function upOperation(): void
    {
        $this->connection->exec('
            CREATE TABLE example (
                id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                name VARCHAR(30) NOT NULL
            )
        ');
    }

    public function downOperation(): void
    {
        $this->connection->exec('DROP TABLE example');
    }
}

执行迁移

执行迁移有两个途径:使用 symfony 框架,或创建自己的 symfony 控制台应用程序。

使用 symfony 框架

如果我们的项目包含 symfony 框架,我们可以直接将命令放入依赖容器中,并使用相应的标签标记它,以便 symfony 的 kernel 和 console 可执行文件直接执行它。为此,需要修改 config/services.yml 文件,添加以下信息:

pdo.connection:
    class: \PDO
    arguments:
        - 'mysql:dbname=testdb;host=localhost;port=3306'
        - 'user'
        - 'password'
        
pdo_migration_command:
    class: Pccomponentes\Migration\MigrationCommand
    arguments:
        - 'pdo'                                     # nombre del comando, que se concatenará a "migration:"
        - '%kernel.root_dir%/../migrations/pdo'     # Ruta al directorio de las migraciones para este comando
        - ['@pdo.connection']                       # Dependencias para construir nuestra migración
    tags:
        - { name: console.command }

创建我们的应用程序

为了能够执行命令,我们首先需要生成一个应用程序。为此,我们应该创建一个包含以下内容的 PHP 文件,并根据需要对其进行修改以适应我们的项目。由于它将是一个控制台可执行文件,我们将命名为 console(无扩展名),并将其放在项目根目录下的 bin 目录中。

#!/usr/bin/env php
<?php
require __DIR__ . '/../vendor/autoload.php';

use Symfony\Component\Console\Application;
use Pccomponentes\Migration\MigrationCommand;

$application = new Application();
$application->addCommands(
    [
        new MigrationCommand(
            'pdo',
            __DIR__ . '/../migration/pdo',
            [
                new \PDO('mysql:dbname=testdb;host=localhost;port=3306', 'user', 'password')
            ]
        )
    ]
);

$application->run();

执行命令

以 UP 模式执行命令:$> bin/console migration:pdo --operation=up PdoMigration

如果我们要执行 DOWN:$> bin/console migration:pdo --operation=down PdoMigration

此外,还可以按顺序执行多个同类型文件。例如:

$> bin/console migration:pdo --operation=up PdoMigration1 PdoMigration2 PdoMigration3