Laravel8にアップグレード後にfakerのseedingでTarget class [Database\Seeders\] does not existでハマる


Laravel7で開発したアプリをLaravel8にアップグレードしてFakerを使おうとしたら以下のようなエラーが出てハマりました。

Target class [Database\Seeders\UsersTableSeeder] does not exist

seedsディレクトリ名を変更

Laravel7まではdatabase/seedsだったのがLaravel8ではdatabase/seedersになりました。そもそもエラーがTarget class [Database\ Seeders] does not existですしね。
(seedsでもseedersでもどっちでもいいよと思うのは私だけ?混乱するような面倒な変更はしないで欲しい・・・)
なので、まずはディレクトリ名をseedersに変更します。

$ mv database/seeds database/seeders

composer.jsonを修正

ディレクトリ名の変更に合わせてcomposer.jsonも変更します。

"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Database\\Factories\\": "database/factories/",
        "Database\\Seeders\\": "database/seeders/"
    }
}

"classmap"は必要なくなったようなので削除します。

Factoryを作り直す

私が使っているのはUserFactory.phpです。Laravel8ではFactoryの内容も変更になったので書き換える必要があります。
現在のUserFactory.phpを修正してもいいのですが、面倒なので元のファイルを違う名前にして保存しておき、新たにartisanコマンドで作り直します。

$ mv UserFactory.php UserFactory7.php 
$ php artisan make:factory UserFactory

新しいUserFactory.phpが出来上がったらUserFactory7.phpから必要な箇所を移植します。
気を付けなければならないのは、\$fakerは$this->fakerにしないとならないこと。

database/factories/UserFactory.php
return [
    $faker->name; // ~Laravel7
    $this->faker->name; // Laravel8
];

*作業が終わったらUserFactory7.phpは消しておきましょう。

モデルを修正

HasFactoryを追加します。

app/User.php
use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\Factories\HasFactory; // 追加

class User extends Authenticatable
{
    use Notifiable;
    use HasFactory; // 追加

DatabaseSeederを修正

namespace Database\Seedersを追加します。

database/seeders/DatabaseSeeder.php
namespace Database\Seeders; // 追加

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder

UsersTableSeederを修正

namespaceを追加します。また、seeder内のcreate文の書き方が変わりました。

database/seeders/UsersTableSeeder.php
namespace Database\Seeders; // 追加

use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{
    public function run()
    {
        // factory(App\User::class, 30)->create(); // ~Laravel7
        \App\User::factory()->count(30)->create(); // Laravel8
    }

実行

最後にcomposer dump-autoloadしてからseedします。

$ composer dump-autoload
$ php artisan db:seed --class=UsersTableSeeder