Laravel 8,找不到模型工厂类

Ahm*_*tab 21 php laravel

所以在使用 laravel 8.x 中引入的新模型工厂类时,我遇到了这个奇怪的问题,说 laravel 找不到与模型对应的工厂。我收到这个错误

PHP Error:  Class 'Database/Factories/BusinessUserFactory' not found in .....

Run Code Online (Sandbox Code Playgroud)

我一直在关注 Laravel 文档,我不知道发生了什么

这是BusinessUser课堂

<?php

namespace App;

use Database\Factories\BusinessUserFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class BusinessUser extends Model
{
    use HasFactory;
}

Run Code Online (Sandbox Code Playgroud)

和工厂

<?php

namespace Database\Factories;

use App\BusinessUser;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

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

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


Run Code Online (Sandbox Code Playgroud)

非常感谢任何想法或线索。

lag*_*box 35

如果您从以前的版本升级到 8,您可能会缺少以下Database\Factories命名空间的 autoload 指令composer.json

"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Database\\Factories\\": "database/factories/",
        "Database\\Seeders\\": "database/seeders/"
    }
},
Run Code Online (Sandbox Code Playgroud)

您也可以移除该classmap部件,因为不再需要它。

composer dump进行这些更改后运行。

Laravel 8.x 文档 - 升级指南 - 数据库 - Seeder 和 Factory 命名空间

  • 如果您尚未升级到 8,但在版本 8 上启动了一个项目,那么可能会出现什么问题? (2认同)

小智 6

显然,您也必须尊重文件夹结构。例如,如果您的用户模型位于以下路径:app\Models\Users\User,则相应的工厂应位于database\factories\Users\UserFactory.


小智 6

我正在从 laravel 7 迁移到 8。

在将我的头撞在墙上一段时间并查看源代码后,我看到您可以选择使用模型上的newFactory方法覆盖为模型调用的工厂类。

我还那么注意到它IS文档中(https://laravel.com/docs/8.x/database-testing#creating-models) -我只是不明白是什么意思,我第一次读它。现在我知道了。

我通过以下方法解决了这个问题:

<?php

namespace My\Fancy\Models;

use Database\Factories\SomeFancyFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class SomeClass extends Model
{
    use HasFactory;

    /** @return SomeFancyFactory */
    protected static function newFactory()
    {
        return SomeFancyFactory::new();
    }
}
Run Code Online (Sandbox Code Playgroud)

在此更改后,我的测试按预期通过。


Joh*_*hhn 5

您需要确保命名空间相同:如下所示:否则这会让您大吃一惊。工厂名称是name of the model+Factory

例如app\models\User- 将匹配到database/factories/UserFactory

最后确保你运行:composer dumpautoload