🏭
Laravel7以下向けパッケージ開発でSeederにFactoryを使う
対象
- Laravel5,6,7系向けのパッケージ開発を行おうと思っている人
- パッケージとしてデータベースにデータを登録する必要がある
- パッケージ開発自体はやったことがある
概要
- composer.json の autoload で seeder や factory を読み込むようにする
- factory をパッケージ側でロードする
- seeder で factory を利用する
- seeder を組み込み側で呼び出す
詳細
Vendor
, Package
のところはそれぞれ置き換える。
クラス名などはそれぞれ好きなように。
ディレクトリ構造も例であって、autoload やパスを正しく設定できれば好きな構造で問題ない。
ディレクトリ構造
- database
- factories
- UserFactory.php
- seeds
- DemoSeeder.php
- migrations
- factories
- 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