Laravel 8,找不到模型工厂类

时间:2020-09-17 17:58:10

标签: php laravel

因此,当使用laravel 8.x中引入的新模型工厂类时,这个奇怪的问题说laravel无法找到与该模型相对应的工厂。我收到此错误

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

我听过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;
}

和工厂

<?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"
        ];
    }
}


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

9 个答案:

答案 0 :(得分:12)

如果从以前的版本升级到8,则可能缺少Database\Factoriescomposer.json名称空间的自动加载指令:

"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Database\\Factories\\": "database/factories/",
        "Database\\Seeders\\": "database/seeders/"
    }
},

由于不再需要classmap部分,因此您也可以删除它。

进行这些更改后运行composer dump

Laravel 8.x Docs - Upgrade Guide - Database - Seeder and Factory Namespace

答案 1 :(得分:1)

也许一切都很完美,只需运行 composer dump-autoload。它发生在我身上。

答案 2 :(得分:1)

在我自己的案例中,它发生在 Laravel 8 项目中,即它不是我从 Laravel 7 升级的项目。我最近在执行 composer update 后注意到了这一点。

1:创建模型时,同时创建工厂

php artisan make:model BusinessUser -f // -f creates the factory

2:对于您的旧型号,注释掉 use HasFactory; 或直接创建工厂

php artisan make:factory BusinessUserFactory -m

答案 3 :(得分:0)

今天,将项目从Laravel 7升级到Laravel 8并在服务器上在线更新后,我遇到了以下问题。

Trait 'Illuminate\Database\Eloquent\Factories\HasFactory' not found

即使我已使用@lagbox给出的自动加载指令对composer.json进行了更新,但仍无法为我解决该问题。

最后,我已经在线更新了完整的供应商文件夹,这些文件夹已解决了我的问题。

希望它对以后的人有帮助!

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我正在从laravel 7迁移到8。

将头撞在墙上一会儿,然后看了一下源代码后,我看到您可以选择使用模型上的newFactory方法来覆盖模型调用的工厂类。

然后我还注意到文档(https://laravel.com/docs/8.x/database-testing#creating-models)中的 IS -我只是不了解我第一次阅读它的含义。现在我知道了。

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

<?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();
    }
}

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

答案 6 :(得分:0)

您需要确保名称空间相同:如下所示:否则,这将使您浪费大量时间。工厂的名称为ALTER TABLE categories CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci ALTER TABLE category_translations CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci + name of the model

例如Factory-将与app\models\User

匹配

最终确保您运行:database/factories/UserFactory

答案 7 :(得分:0)

我遇到了同样的问题,但原因有所不同。如果您在测试的setUp函数中使用工厂,请确保:

  1. 您要扩展Tests\TestCase(而不是PHPUnit\Framework\TestCase
  2. 您的setUp函数的第一行应为parent::setUp();(我错过了)

答案 8 :(得分:-1)

将此添加到 AppServiceProvider::boot() 以防止模型猜测的命名空间。

Factory::guessFactoryNamesUsing(function (string $modelName) {
        return 'Database\\Factories\\' . Arr::last(explode('\\', $modelName)) . 'Factory';
    });