garanaw/seedable-migrations

允许以更受控的方式自我播种迁移

1.1.0 2024-03-21 19:00 UTC

This package is auto-updated.

Last update: 2024-09-21 19:55:58 UTC


README

Tests Linting

关于

Laravel提供了一个带有播种的迁移系统。然而,播种系统并不太灵活。这个包提供了一种更灵活的方式来通过与迁移相关联的播种文件来播种您的数据库。

您可以在每次迁移后或批量结束时运行您的播种。您还可以指定应在迁移的UP方法或DOWN方法上运行的播种文件。

安装

要安装此包,请运行以下命令

composer require garanaw/seedable-migrations

安装包后,您需要发布迁移占位符

php artisan vendor:publish --provider="Garanaw\SeedableMigrations\SeedableMigrationsServiceProvider"

如果您不想发布占位符,则需要从Garanaw\SeedableMigrations\Migration类手动扩展您的迁移。

新的迁移文件

当您运行php artisan make:migration命令时,迁移文件现在看起来会有所不同。新的迁移文件将如下所示

<?php

declare(strict_types=1);

use Garanaw\SeedableMigrations\Blueprint;
use Garanaw\SeedableMigrations\Enum\SeedAt;
use Garanaw\SeedableMigrations\Migration;

return new class extends Migration
{
    public function up(): void
    {
        $this->schema->create(table: $this->getTable(), callback: static function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    public function getTable(): string
    {
        return $this->table;
    }

    public function seedAt(): SeedAt
    {
        return SeedAt::EACH;
    }

    public function down(): void
    {
        $this->schema->dropIfExists($this->getTable());
    }
}

以下几点需要注意

  • 现在模式是迁移类的一个属性。如果您更喜欢外观,您仍然可以使用它通过Schema::create()
  • 现在up()down()都有void的返回类型提示。这不是强制性的,但建议这样做。
  • 增加了两个新方法:getTable()seedAt()getTable()方法用于获取迁移的表名。
  • seedAt()方法用于指定播种器何时运行。您可以返回SeedAt::EACH以在每次迁移后运行播种器,或返回SeedAt::BATCH以在批量结束时运行播种器。如果您不想运行播种器,则可以返回SeedAt::NONE

新的播种文件

当您运行php artisan make:seeder命令时,播种文件现在看起来会有所不同。新的播种文件将如下所示

<?php

declare(strict_types=1);

use Garanaw\SeedableMigrations\Seeder;

return MySeeder extends Seeder
{
    public function run(): bool
    {
        // Your seeder code here
    }

    public function getData(): array
    {
        return [];
    }
}

以下几点需要注意

  • 现在必须实现run()方法。这是您放置播种代码的地方。
  • getData()方法用于返回应播种的数据。此方法现在是强制性的,因为它遵循一个接口。如果您不想播种任何内容,则可以返回一个空数组。
  • 现在run()方法有一个bool的返回类型提示。这是强制性的,因为它遵循一个接口,并用于存储失败的播种器。
  • 如果您的播种器包含一个名为configure()的方法,它将通过Container::call()被调用。这意味着您可以在播种器类中使用依赖注入来添加额外的配置(如果需要的话)。
  • 或者,您可以在播种器类中创建一个__construct()方法。该方法将在run()方法之前被调用,并且您可以在其中使用依赖注入,但它将需要来自父类的参数。

如何使用

要运行您的迁移,您可以使用与往常一样的php artisan migrate命令。播种将自动完成。

要指定与迁移关联的播种文件,您需要在迁移文件中添加一些方法

    public function seedersUp(): \Illuminate\Support\Collection
    {
        return collect([
            MySeeder::class,
        ]);
    }

    public function seedersDown(): \Illuminate\Support\Collection
    {
        return collect([
            MySeeder::class,
        ]);
    }

seedersUp() 方法用于指定在迁移的 UP 方法上应该运行的种子文件。seedersDown() 方法用于指定在迁移的 DOWN 方法上应该运行的种子文件。这些方法都不是强制的。如果您没有指定任何种子文件,则种子文件将不会运行。

另一个可选的方法是 shouldSeed() 方法。此方法用于指定种子是否应该运行。如果您只想在特定的环境中运行种子,此方法非常有用。默认实现是

    public function shouldSeed(): bool
    {
        return true;
    }

shouldSeed() 方法中,您可以使用 app()->environment() 方法来检查环境,或使用任何其他逻辑来确定种子是否应该运行。

要配置您的种子,您只需在您的种子类中添加一个 configure() 方法

    public function configure(
        \Illuminate\Config\Repository $config,
        \Illuminate\Foundation\Application $app,
        \Illuminate\Contracts\Console\Kernel $artisan,
        \Illuminate\Contracts\Debug\ExceptionHandler $exceptionHandler,
        App\Providers\RouteServiceProvider $routeServiceProvider,
        \Psr\Log\LoggerInterface $logger,
    ): void {
        // Your configuration code here. You can inject anything that is configured in your container
    }

安全漏洞

如果您发现了一个安全漏洞,请使用问题跟踪器创建一个问题。

许可协议

Seedable Migrations 库是开源软件,许可协议为 MIT 许可协议