所以在使用 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 命名空间
小智 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)
在此更改后,我的测试按预期通过。
您需要确保命名空间相同:如下所示:否则这会让您大吃一惊。工厂名称是name of the model
+Factory
例如app\models\User
- 将匹配到database/factories/UserFactory
最后确保你运行:composer dumpautoload
归档时间: |
|
查看次数: |
20288 次 |
最近记录: |