概要
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();
}
}
解決。