命令

Phinx 使用许多命令运行。

断点命令

断点命令用于设置断点,允许您限制回滚。您可以通过不提供任何参数来切换最新迁移的断点。

$ phinx breakpoint -e development

要在特定版本上切换断点,请使用 --target 参数或缩写 -t

$ phinx breakpoint -e development -t 20120103083322

您可以使用 --remove-all 参数或缩写 -r 来删除所有断点。

$ phinx breakpoint -e development -r

您可以使用 -set--unset 在最新迁移(或与 --target-t 参数结合使用时在特定迁移上)设置或取消设置(而不是仅仅切换)断点。

当您运行 status 命令时,断点可见。

创建命令

创建命令用于创建一个新的迁移文件。它需要一个参数:迁移的名称。迁移名称应使用驼峰命名法指定。

$ phinx create MyNewMigration

在您的文本编辑器中打开新的迁移文件以添加您的数据库转换。Phinx 使用您在 phinx 配置文件中指定的路径创建迁移文件。有关更多信息,请参见配置一章。

您可以通过提供替代模板文件名来覆盖 Phinx 使用的模板文件。

$ phinx create MyNewMigration --template="<file>"

您也可以提供一个模板生成类。此类必须实现接口 Phinx\Migration\CreationInterface

$ phinx create MyNewMigration --class="<class>"

除了提供迁移模板之外,该类还可以定义一个回调函数,该函数将在从模板生成迁移文件后被调用。

您不能同时使用 --template--class

初始化命令

初始化命令(缩写为初始化)用于为 Phinx 准备您的项目。此命令在您项目的根目录中生成 phinx 配置文件。默认情况下,此文件将被命名为 phinx.php

$ phinx init

您可以选择为 Phinx 的配置文件指定一个自定义位置

$ phinx init ./custom/location/

您还可以指定一个自定义文件名

$ phinx init custom-config.yml

以及与 php、yml 和 json 不同的格式。例如,要创建 yml 文件

$ phinx init --format yml

在您的文本编辑器中打开此文件以设置您的项目配置。有关更多信息,请参见配置一章。

迁移命令

迁移命令运行所有可用的迁移,可以选择运行到特定版本。

$ phinx migrate -e development

要迁移到特定版本,请使用 --target 参数或缩写 -t

$ phinx migrate -e development -t 20110103081132

使用 --dry-run 将查询打印到标准输出而不执行它们

$ phinx migrate --dry-run

回滚命令

回滚命令用于撤消 Phinx 执行的先前迁移。它是迁移命令的反向操作。

您可以使用不带任何参数的 rollback 命令回滚到上一个迁移。

$ phinx rollback -e development

要将所有迁移回滚到特定版本,请使用 --target 参数或缩写 -t

$ phinx rollback -e development -t 20120103083322

指定 0 作为目标版本将还原所有迁移。

$ phinx rollback -e development -t 0

要将所有迁移回滚到特定日期,请使用 --date 参数或缩写 -d

$ phinx rollback -e development -d 2012
$ phinx rollback -e development -d 201201
$ phinx rollback -e development -d 20120103
$ phinx rollback -e development -d 2012010312
$ phinx rollback -e development -d 201201031205
$ phinx rollback -e development -d 20120103120530

如果设置了断点,阻止进一步回滚,您可以使用 --force 参数或缩写 -f 覆盖断点。

$ phinx rollback -e development -t 0 -f

使用 --dry-run 将查询打印到标准输出而不执行它们

$ phinx rollback --dry-run

注意

回滚时,Phinx 使用您在 phinx 配置文件的 version_order 选项中指定的顺序对执行的迁移进行排序。有关更多信息,请参见配置一章。

状态命令

状态命令打印所有迁移的列表,以及它们当前的状态。您可以使用此命令来确定哪些迁移已运行。

$ phinx status -e development

如果数据库是最新的(即所有迁移都已完成),则此命令以代码 0 退出,否则退出以下代码之一

  • 2: 至少有一个缺少的迁移。

  • 3: 至少有一个向下迁移。

退出代码 1 表示发生了应用程序错误。

种子创建命令

种子创建命令可用于创建新的数据库种子类。它需要一个参数,即类的名称。类名应使用驼峰命名法指定。

$ phinx seed:create MyNewSeeder

在您的文本编辑器中打开新的种子文件以添加您的数据库种子命令。Phinx 使用您在配置文件中指定的路径创建种子文件。有关更多信息,请参见配置一章。

您可以通过提供替代模板文件名来覆盖 Phinx 使用的模板文件。

$ phinx seed:create MyNewSeeder --template="<file>"

种子运行命令

种子运行命令运行所有可用的种子类,或者选择只运行一个种子类。

$ phinx seed:run -e development

要仅运行一个种子类,请使用 --seed 参数或缩写 -s

$ phinx seed:run -e development -s MyNewSeeder

配置文件参数

从命令行运行 Phinx 时,您可以使用 --configuration-c 参数指定配置文件。除了 YAML 以外,配置文件还可以是作为 PHP 数组的 PHP 文件的计算输出

<?php
    return [
        "paths" => [
            "migrations" => "application/migrations"
        ],
        "environments" => [
            "default_migration_table" => "phinxlog",
            "default_environment" => "dev",
            "dev" => [
                "adapter" => "mysql",
                "host" => $_ENV['DB_HOST'],
                "name" => $_ENV['DB_NAME'],
                "user" => $_ENV['DB_USER'],
                "pass" => $_ENV['DB_PASS'],
                "port" => $_ENV['DB_PORT']
            ]
        ]
    ];

Phinx 自动检测对具有 *.yaml*.yml*.json*.php 扩展名的文件的语言解析器。也可以通过 --parser-p 参数指定相应的解析器。除 "json""php" 之外的任何内容都将被视为 YAML。

使用 PHP 数组时,您可以提供一个具有现有 PDO 实例的 connection 键。传递数据库名称也很重要,因为 Phinx 在某些方法(如 hasTable())中需要它。

<?php
    return [
        "paths" => [
            "migrations" => "application/migrations"
        ),
        "environments" => [
            "default_migration_table" => "phinxlog",
            "default_environment" => "dev",
            "dev" => [
                "name" => "dev_db",
                "connection" => $pdo_instance
            ]
        ]
    ];

在 Web 应用程序中运行 Phinx

Phinx 还可以通过使用 Phinx\Wrapper\TextWrapper 类在 Web 应用程序内部运行。这在 app/web.php 中提供了示例,该文件可以作为独立服务器运行

$ php -S localhost:8000 vendor/robmorgan/phinx/app/web.php

这将在 https://127.0.0.1:8000 处创建一个本地 Web 服务器,该服务器默认情况下将显示当前迁移状态。要向上运行迁移,请使用 https://127.0.0.1:8000/migrate,要回滚,请使用 https://127.0.0.1:8000/rollback

包含的 Web 应用程序只是一个示例,不应在生产环境中使用!

注意

要在运行时修改配置变量并覆盖 %%PHINX_DBNAME%% 或其他动态选项,请在运行命令之前设置 $_SERVER['PHINX_DBNAME']。可用的选项在“配置”页面中记录。

将 Phinx 包裹在另一个 Symfony 控制台应用程序中

Phinx 可以被封装并作为单独的 Symfony 控制台应用程序运行。这可能有利于为用户提供一个统一的界面,用于应用程序的所有方面,或者因为您希望运行多个 Phinx 命令。虽然您可以通过 exec 运行命令或使用上面的 Phinx\Wrapper\TextWrapper,但这使得很难以与您的应用程序类似的方式处理返回值和输出。

幸运的是,Symfony 使执行这种“元”命令变得直接。

use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Phinx\Console\PhinxApplication;

// ...

protected function execute(InputInterface $input, OutputInterface $output)
{

    $phinx = new PhinxApplication();
    $command = $phinx->find('migrate');

    $arguments = [
        'command'         => 'migrate',
        '--environment'   => 'production',
        '--configuration' => '/path/to/phinx/config/file'
    ];

    $input = new ArrayInput($arguments);
    $returnCode = $command->run(new ArrayInput($arguments), $output);
    // ...
}

这里,您正在实例化 PhinxApplication,告诉它找到 migrate 命令,定义要传递给它的参数(与命令行参数和标志匹配),最后运行该命令,将相同的 OutputInterface 传递给它,您的应用程序使用。

有关更多信息,请参阅 Symfony 页面

将 Phinx 与 PHPUnit 一起使用

Phinx 可用于您的单元测试中以准备或填充数据库。您可以以编程方式使用它

public function setUp ()
{
  $app = new PhinxApplication();
  $app->setAutoExit(false);
  $app->run(new StringInput('migrate'), new NullOutput());
}

如果您使用的是内存数据库,您需要为 Phinx 提供一个特定的 PDO 实例。您可以使用 Manager 类直接与 Phinx 交互

use PDO;
use Phinx\Config\Config;
use Phinx\Migration\Manager;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Console\Input\StringInput;
use Symfony\Component\Console\Output\NullOutput;

class DatabaseTestCase extends TestCase {

    public function setUp ()
    {
        $pdo = new PDO('sqlite::memory:', null, null, [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        ]);
        $configArray = require('phinx.php');
        $configArray['environments']['test'] = [
            'adapter'    => 'sqlite',
            'connection' => $pdo
        ];
        $config = new Config($configArray);
        $manager = new Manager($config, new StringInput(' '), new NullOutput());
        $manager->migrate('test');
        $manager->seed('test');
        // You can change default fetch mode after the seeding
        $this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
        $this->pdo = $pdo;
    }

}