PSR-4 兼容性

Phinx 允许在迁移和Seeder 中使用命名空间。迁移需要在文件名中包含时间戳,因此不会完全符合 PSR-4 规范。Seeder 不需要时间戳,将完全符合 PSR-4 规范。

使用命名空间

  1. 找到您的 Phinx 配置文件,配置文件可能采用以下三种格式之一:PHP、YAML 或 JSON。

  2. 找到配置文件中的“paths”键,它应该类似于以下示例之一。
    • (注意。“migrations”和“seeds”键可以是数组或字符串,所以如果您的看起来不同,不要担心)

PHP

'paths' => [
    'migrations' => 'database/migrations',
    'seeds' => 'database/seeds',
],

YAML

paths:
    migrations: ./database/migrations
    seeds: ./database/seeds

JSON

{
    "paths": {
        "migrations": "database/migrations",
        "seeds": "database/seeds"
    }
}
  1. 启用命名空间是一个相当简单的任务,我们将把“migrations”和“seeds”键变成数组。
    • 任何没有键的值都是全局非命名空间路径

    • 任何带键的值将使用键作为命名空间

'paths' => [
    'migrations' => [
        '/path/to/migration/without/namespace', // Non-namespaced migrations
        'Foo' => '/path/to/migration/Foo', // Migrations in the Foo namespace
    ],
    'seeds' => [
        '/path/to/seeds/without/namespace', // Non-namespaced seeders
        'Baz' => '/path/to/seeds/Baz', // Seeders in the Baz namespace
    ]
],

PHP 在这种情况下有点特殊,因为它允许在同一个数组中使用无键和带键的值。为了使此配置在 YAML 和 JSON 中工作,我们必须使用“0”作为非命名空间路径的键。

{
    "paths": {
        "migrations": {
            "0": "./db/migrations",
            "Foo\\Bar": "./src/FooBar/db/migrations"
        }
    }
}
paths:
    migrations:
        0: ./db/migrations
        Foo\\Bar: ./src/FooBar/db/migrations

路径解析

让我们仔细看看路径是如何解析的,从非命名空间路径开始。

“./”指的是项目根目录,因此“./db/migrations”将解析为<项目根目录>/db/migrations。这是 Phinx 在迁移时将查找迁移的目录。注意。这些迁移不能有命名空间。

https://i.imgur.com/l84308Q.jpg

此图像显示了“./db/migrations”的路径,其中“Phinx”是项目根目录。

命名空间路径将按如下所示解析。

“./src/FooBar/db/migrations”将解析为<项目根目录>/src/FooBar/db/migrations,这是 Phinx 将在 Foo\Bar 命名空间中查找迁移的目录。

https://i.imgur.com/2mg0V8V.jpg

如果项目根目录是“Phinx”,则文件路径将如下所示

文件示例

在<项目根目录>/db/migrations 中的非命名空间文件可能类似于以下示例。

<?php

use Phinx\Migration\AbstractMigration;

class CreateUserTable extends AbstractMigration
{
    public function change()
    {
        $table = $this->table('users');
        $table->addColumn('name', 'string')->create();
    }
}

而命名空间文件将位于<项目根目录>/src/FoorBar/db/migrations 中,并且可能看起来像这样:(注意命名空间与路径配置中定义的命名空间相同)。

<?php

namespace Foo\Bar;

use Phinx\Migration\AbstractMigration;

class CreateUserTable extends AbstractMigration
{
    public function change()
    {
        $table = $this->table('users');
        $table->addColumn('name', 'string')->create();
    }
}
  1. 就这样,您已经准备好了,要创建迁移,只需运行:$ phinx create CreateUsersTable [–path ./src/FoorBar/db/migrations]

    • 如果配置了多个路径,但没有使用 –path 标志提供任何路径,系统将提示您使用哪个路径。

您遇到问题了吗?

  • 由于迁移的创建方式,不可能在全局命名空间中生成一个具有与用户定义命名空间中的迁移相同的类名的迁移。