【Laravel11.x】バージョンアップ後にseederを実行した時に遭遇する”Target class [DatabaseSeeder] does not exist”エラーについて

PHP

学習用に所持しているサイトがあるのですが、最近そちらのインフラをconohaからAWSに移行したのち、PHPのバージョンを7.4 > 8.2へ、併せてLaravelのバージョンを6.xから11.xへと引き上げました。

とある作業でSeederを作成し、実行しようと思ったのですがうまく動作しなかったのでその備忘録となります。

なぜ動作しないか

Laravelのバージョンを11.xに引き上げたことで、周辺コードの記述が昔と変わっていることが原因の1つです。

下記は各バージョンで存在するDatabaseSeederに関するファイルですが、

laravel/database/seeds/DatabaseSeeder.php at 6.x · laravel/laravel
Laravel is a web application framework with expressive, elegant syntax. We’ve already laid the foundation for your next big idea — freeing you to create without...
laravel/database/seeders/DatabaseSeeder.php at 11.x · laravel/laravel
Laravel is a web application framework with expressive, elegant syntax. We’ve already laid the foundation for your next big idea — freeing you to create without...

ファイルの内容が異なるのはもちろん、Seederファイルを格納するためのフォルダ名にも違いがあります(.../seeds/.../seeders/)。

最初からLaravel11.xをインストールした場合はこの部分で齟齬が発生することはないかと思いますが、バージョンを古いものから引き上げた際に作業に見落としがあった場合(自分です…)正しくSeederが実行できない挙動に遭遇するケースがあるようです。

動作するようにする

まずはフォルダの名前をseedsからseedersに変更します。

その後、DatabaseSeeder.phpの内容も上記URLを参考に11.xのものに上書きしましょう。

次にcomposer.jsonも調整します。

    "autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            ↓古いバージョンだと "database/seeds"になっているので併せて直す
            "database/seeders",
            "database/factories"
        ]
    },

調整後はcomposer dump-autoloadを実行して情報を更新してください。

実行後、作ったSeederがあるならphp artisan db:seedで実行テストをします。

php artisan db:seed

   INFO  Seeding database.  

  Database\Seeders\thread\ReactionIconTableSeeder ............................................................ RUNNING  
  Database\Seeders\thread\ReactionIconTableSeeder ........................................................ 117 ms DONE  

無事に動作しました!

備考

自分のファイルのメモです。名前空間で少し迷ったので改修などの参考になれば。

# database/seeders/DatabaseSeeder.php
<?php

namespace Database\Seeders;

// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     */
    public function run(): void
    {
        // 自作したSeeder
        $this->call(\Database\Seeders\thread\ReactionIconTableSeeder::class);
    }
}
# database/seeders/thread/ReactionIconTableSeeder.php
<?php

namespace Database\Seeders\thread;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

use App\Models\ReactionIcon;


class ReactionIconTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
      ReactionIcon::truncate(); // 指定モデルの情報を全て削除
      $reaction_icons = [
        [
          // tableに入れたいものを書いていく
        ],
        [
          // ....
        ],
      ];

      foreach ($reaction_icons as $reaction_icon) {
        ReactionIcon::create($reaction_icon);
      }

    }
}

namespaceの変更やSeederを新規作成した場合、composer dump-autoloadで読み込みを忘れないよう!

コメント

タイトルとURLをコピーしました