LoginSignup
1
2

More than 3 years have passed since last update.

Laravel8 AppかApp\ModelsにModelファイルがない場合にdatabase/factoryは同じフォルダ構成にしないと動かない

Last updated at Posted at 2020-09-15

Laravel 8にアップグレードして、testを実行したところfactoryのファイルが見つからないとエラーが出ました。
(ModelにHasFactoryは追加済)
Class 'Database\Factories\Infrastructure\Eloquents\Models\PostFactory' not found

実際ファイルは下記のように配置していたのでパスが一致してません。
Database\Factories\PostFactory

修正前PostFactory.php

<?php declare(strict_types=1);

// Factoriesの直下に配置
namespace Database\Factories;

use App\Infrastructure\Eloquents\Models\Post;
use Illuminate\Database\Eloquent\Factories\Factory;

class PostFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Post::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'name'=> 'test'
         ];
    }
}

エラーの該当箇所を見ると、AppかApp\Models以外にmodel.phpが置かれている場合にエラーになるようです。
今回のプロジェクトではInfrastructure\Eloquents\Models配下にModel類を置いているので今更変えるのは難しいです。

Factory.php
public static function resolveFactoryName(string $modelName)
    {
        $resolver = static::$factoryNameResolver ?: function (string $modelName) {
            $modelName = Str::startsWith($modelName, 'App\\Models\\')
                ? Str::after($modelName, 'App\\Models\\')
                : Str::after($modelName, 'App\\');

            return static::$namespace.$modelName.'Factory';
        };

        return $resolver($modelName);
    }

参考記事にあるようにDatabase\Factories配下にModelフォルダと同じフォルダ構成を作成すれば良さそう。

PostFactory.php
<?php declare(strict_types=1);

// PostModelの配置場所と同じ構成にする
namespace Database\Factories\Infrastructure\Eloquents\Models;

use App\Infrastructure\Eloquents\Models\Post;
use Illuminate\Database\Eloquent\Factories\Factory;

class PostFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Post::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'name'=> 'test'
         ];
    }
}

無事テストが通過するようになりました!

参考記事
https://laracasts.com/discuss/channels/laravel/laravel-8-model-factory-namespaces

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