0
1

More than 1 year has passed since last update.

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

Posted at

対象

  • 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 を有効にする

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

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

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

ServiceProvider.php
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 を使う

Seeder.php
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.

となれば完成!

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1