はじめに
Laravel 6から8へアップグレードした際にアップグレード自体は問題なくできたのですが、
シーダーの実行につまずいたので残しておきます。
事象
シーダーを実行すると以下のようなエラーが出ました。
$ php artisan db:seed
Illuminate\Contracts\Container\BindingResolutionException
Target class [DatabaseSeeder] does not exist.
変更箇所
Laravel 8へアップグレードした後にシーダーを使うための変更箇所をまとめます。
1. composer.jsonの変更
変更前
"autoload": {
"psr-4": {
"App\\": "app/",
},
"classmap": [
"database/seeds",
"database/factories"
]
},
変更後
"autoload": {
"psr-4": {
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
}
},
変更後にcomposer dump-autoload
を実行します。
$ composer dump-autoload
2. フォルダ名称の変更
database/seeds
フォルダをdatabase/seeders
フォルダへ名称を変更します。
変更前
└── database
├── factories
├── migrations
└── seeds
変更後
└── database
├── factories
├── migrations
└── seeders
3. seederのファイルの変更
seederのファイルにDatabase\Seeders
名前空間を追加します。
変更前
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
変更後
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
つまずいた原因
これを見落としていました。
composer.jsonやseederのファイルの変更に気がとられて
単純なところが抜けていました。
Laravelの公式ドキュメントにもしっかりと、しかしそっと書いてあります。
なんで見落としたんだ。。。
シーダとファクトリの名前空間
影響の可能性: 高いシーダとファクトリは名前空間になりました。これらの変更に対応するには、Database\Seeders名前空間をシードクラスに追加します。さらに、以前のdatabase/seedsディレクトリの名前をdatabase/seedersに変更する必要があります:
Laravelの公式ドキュメントより引用
抜けていたフォルダ名称の変更も含めて
3点を変更することによって問題なくseederが実行できました。
$ php artisan db:seed
Database seeding completed successfully.
参考記事
https://readouble.com/laravel/8.x/ja/upgrade.html#seeder-factory-namespaces
https://www.itsolutionstuff.com/post/solved-laravel-8-target-class-databaseseeder-does-not-existexample.html