命令
Phinx 是通过许多命令来运行的。
Breakpoint (断点) 命令
Breakpoint 命令用于设置断点,允许你限制回滚操作。如果不提供任何参数,你可以切换最近一次迁移的断点状态。
# -e development: 用于指定要执行的环境,在这个例子中是 development 环境
$ 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 命令时,断点是可见的。
Create (创建) 命令
Create 命令用于创建一个新的迁移文件。它需要一个参数:迁移的名称。迁移名称应以驼峰式(CamelCase)格式指定。
$ phinx create MyNewMigration
在你的文本编辑器中打开新的迁移文件以添加你的数据库转换。Phinx 会使用你在 phinx 配置文件中指定的路径来创建迁移文件。请参阅 配置 章节以获取更多信息。
你可以通过提供一个备用模板文件名来覆盖 Phinx 使用的模板文件。
$ phinx create MyNewMigration --template="<file>"
你也可以提供一个模板生成类。这个类必须实现 Phinx\Migration\CreationInterface 接口。
$ phinx create MyNewMigration --class="<class>"
除了为迁移提供模板外,该类还可以定义一个回调函数,在从模板生成迁移文件后调用。
你不能同时使用 --template 和 --class。
Init (初始化) 命令
Init 命令(initialize 的缩写)用于为你的项目准备 Phinx。此命令会在你项目目录的根目录下生成 phinx 配置文件。默认情况下,该文件将命名为 phinx.php。
$ phinx init
或者,你可以为 Phinx 的配置文件指定一个自定义位置:
$ phinx init ./custom/location/
你还可以指定一个自定义文件名:
$ phinx init custom-config.yml
以及不同于 php、yml 和 json 的格式。例如,要创建一个 yml 文件:
$ phinx init --format yml
在你的文本编辑器中打开此文件以设置你的项目配置。请参阅配置章节以获取更多信息。
Migrate (迁移) 命令
Migrate 命令会运行所有可用的迁移,也可以选择性地迁移到指定的版本。
$ phinx migrate -e development
要迁移到特定版本,请使用 --target 参数,或简写为 -t。
$ phinx migrate -e development -t 20110103081132
使用 --dry-run 可以将查询语句打印到标准输出而不执行它们。
$ phinx migrate --dry-run
Rollback (回滚) 命令
Rollback 命令用于撤销由 Phinx 执行的先前迁移。它与 Migrate 命令相反。
你可以通过不带参数使用 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 选项指定的顺序来排序已执行的迁移。请参阅 配置 章节以获取更多信息。
Status (状态) 命令
Status 命令会打印所有迁移的列表,以及它们的当前状态。你可以使用此命令来确定哪些迁移已经运行。
$ phinx status -e development
如果数据库是最新状态(即所有迁移都已 up),此命令以代码 0 退出,否则以以下代码之一退出:
- 2: 至少有一个缺失的迁移。
- 3: 至少有一个已
down的迁移。
退出代码为 1 意味着发生了应用程序错误。
Seed Create (创建填充) 命令
Seed Create 命令可用于创建新的数据库填充类。它需要一个参数,即类的名称。类名应以驼峰式(CamelCase)格式指定。
$ phinx seed:create MyNewSeeder
在你的文本编辑器中打开新的填充文件以添加你的数据库填充命令。Phinx 会使用你在配置文件中指定的路径来创建填充文件。请参阅 配置 章节以获取更多信息。
你可以通过提供一个备用模板文件名来覆盖 Phinx 使用的模板文件。
$ phinx seed:create MyNewSeeder --template="<file>"
Seed Run (运行填充) 命令
Seed Run 命令会运行所有可用的填充类,或者选择性地只运行一个。
$ 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\Wrapper\TextWrapper 类,Phinx 也可以在 Web 应用程序内部运行。app/web.php 中提供了一个示例,可以作为独立服务器运行:
$ php -S localhost:8000 vendor/robmorgan/phinx/app/web.php
这将在 http://localhost:8000 创建一个本地 Web 服务器,默认显示当前的迁移状态。要向上迁移,请使用 http://localhost:8000/migrate,要回滚,请使用 http://localhost: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
]);
$configPath = __DIR__ . '/../phinx.php';
$configArray = require $configPath;
$configArray['environments']['test'] = [
'adapter' => 'sqlite',
'connection' => $pdo,
'name' => ':memory:',
];
$config = new Config(
$configArray,
$configPath
);
$manager = new Manager($config, new StringInput(' '), new NullOutput());
$manager->migrate('test');
$manager->seed('test');
$this->pdo = $pdo;
// 你可以在填充数据后更改默认的获取模式
$this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
}
}