1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

記事投稿キャンペーン 「2024年!初アウトプットをしよう」

LaravelのModelsの階層を変えたらテストやSeederでエラーが出る

Posted at

概要

Laravelの階層を App\Models\User から App\Models の元の状態に戻した。
テストを実行するとモデルを読み込めていないようなエラーが出るようになった。
ちょっと詰まったので備忘録として書いとく。

Class "App\User" not found

変更したファイル

  • app/Models
    • 名前空間
  • app/confit/auth.php
    • 認証に使用しているモデルの階層
  • その他モデルをuseしているファイル

環境

  • Laravel10
  • PHP8.1
  • MySQL8
  • Docker

やったとこと

① キャッシュクリア

php artisan config:clear
php artisan route:clear
php artisan view:clear
php artisan cache:clear
php artisan clear-compiled

② Composerの更新

composer dump-autload

③ Dockerの再起動

docker compose down
docker compose up

全部試したけどダメだった

結論

Factoryの階層を変えるorモデル名を明示的にしないとダメだった。

Modelsの階層に合わせてFactoryも database/factories/User/ のような階層になっていた。
Laravelは内部的に、モデルをネームスペースとクラス名から自動的に推測しようとするらしく、階層をそのままにしたいときは protected $model = User::class; のように明示的にしないといけないらしい(言われてみれば確かに...)

<?php

namespace Database\Factories\User;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
 */
class UserFactory extends Factory
{
    // ここで明示的にモデルを指定する
    protected $model = User::class;

    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition(): array
    {
        return [
            'name' => '田中 太郎',
            'name_kana' => 'たなか たろう',
            'email' => 'user@example.com',
            'email_verified_at' => now()
        ];
    }
}

モデル側でも同様にFactoryを指定してあげる

<?php

declare(strict_types=1);

namespace App\Models;

use Database\Factories\User\UserFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory;

    protected static function newFactory()
    {
        return UserFactory::new();
    }
}

解決。

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?