Laravel8 AppかApp\ModelsにModelファイルがない場合にdatabase/factoryは同じフォルダ構成にしないと動かない
Laravel 8にアップグレードして、testを実行したところfactoryのファイルが見つからないとエラーが出ました。
(ModelにHasFactoryは追加済)
Class 'Database\Factories\Infrastructure\Eloquents\Models\PostFactory' not found
実際ファイルは下記のように配置していたのでパスが一致してません。
Database\Factories\PostFactory
<?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類を置いているので今更変えるのは難しいです。
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フォルダと同じフォルダ構成を作成すれば良さそう。
例
<?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
Author And Source
この問題について(Laravel8 AppかApp\ModelsにModelファイルがない場合にdatabase/factoryは同じフォルダ構成にしないと動かない), 我々は、より多くの情報をここで見つけました https://qiita.com/ekusuy/items/245c1cf26f88c3d9e518著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .