🏭

Laravel7以下向けパッケージ開発でSeederにFactoryを使う

2021/12/29に公開

対象

  • Laravel5,6,7系向けのパッケージ開発を行おうと思っている人
  • パッケージとしてデータベースにデータを登録する必要がある
  • パッケージ開発自体はやったことがある

概要

  • composer.json の autoload で seeder や factory を読み込むようにする
  • factory をパッケージ側でロードする
  • seeder で factory を利用する
  • seeder を組み込み側で呼び出す

詳細

Vendor, Package のところはそれぞれ置き換える。
クラス名などはそれぞれ好きなように。
ディレクトリ構造も例であって、autoload やパスを正しく設定できれば好きな構造で問題ない。

ディレクトリ構造

  • database
    • factories
      • UserFactory.php
    • seeds
      • DemoSeeder.php
    • migrations
  • src
    • ServiceProvider.php
    • Models
      • User.php

autoload を有効にする

"autoload": {
    "psr-4": {
        "Vendor\\Package\\": [
            "src/",
            "database/"
        ]
    }
},
"extra": {
    "laravel": {
        "providers": [
            "Vendor\\Package\\ServiceProvider"
        ]
    }
}

特に重要なのは "Vendor\\Package\\": [] で配列として渡しているところ。
大抵のパッケージだと "Vendor\\Package\\": "src/" としていることだと思う。

factory のディレクトリを読み込ませる

namespace Vendor\Package;
use Illuminate\Database\Eloquent\Factory;
public function boot(): void
{
    $this->app->afterResolving(
        Factory::class,
        function ($factory) {
            $factory->load(__DIR__ . '/../database/seeds');
        }
    );
}

seeder で factory を使う

namespace Vendor\Package\Database\Seeds;
use Vendor\Package\Models\User;
class DemoSeeder extends Seeder
{
    public function run()
    {
        factory(User::class, 5)->create();
    }
}

組み込み側で seeder を使う

composer dump-autoload
php artisan db:seed --class=Vendor\\Package\\Database\\Seeds\\DemoSeeder

Database seeding completed successfully.

となれば完成!

Discussion