Laravel工厂状态-无法找到工厂

时间:2018-06-28 02:10:41

标签: php laravel state factory

执行工厂时遇到问题,我已经将工厂状态用于工厂,但是执行工厂时会给我一个错误 https://laravel.com/docs/5.6/database-testing#factory-states

我有这个UserFactory.php,其中包含以下代码。

<?php

use Faker\Generator as Faker;

$factory->state(App\User::class,'suggestor', function (Faker $faker) {
    return [
        'FirstName'=>$faker->firstName, 
        'LastName'=>$faker->lastName, 
        'Username'=>$faker->userName, 
        'password'=>bcrypt('123asd!@#'),
        'Email'=>$faker->email,
        'AccountType'=>0,
    ];
});

我正在使用 tinker 执行工厂命令并尝试了不同的语法,但这确实不能解决问题。

>>> factory(User::class, 1)->states('suggestor')->make();
[!] Aliasing 'User' to 'App\User' for this Tinker session.
InvalidArgumentException with message 'Unable to locate factory with name [default] [User].'
>>> factory(App\User::class, 1)->states('suggestor')->make();
InvalidArgumentException with message 'Unable to locate factory with name [default] [App/User].'
>>> factory(\App\User::class, 1)->states('suggestor')->make();
InvalidArgumentException with message 'Unable to locate factory with name [default] [App/User].'
>>> factory('App\User')->states('suggestor')->make();
InvalidArgumentException with message 'Unable to locate factory with name [default] [App/User].'
>>> factory('App\User',1)->states('suggestor')->make();
InvalidArgumentException with message 'Unable to locate factory with name [default] [App/User].'
>>>

我希望外面有人可以帮助我。

更新: 我试图在数据库种子上运行它,但我认为它仍然是相同的错误。 但是当我尝试其他模型时,看起来还不错。我认为问题出在laravel开箱即用的用户模型上,请注意,除了模型属性外,我没有对用户模型进行任何更改。

播种机产生错误 enter image description here

2 个答案:

答案 0 :(得分:1)

有时,工厂在网络路由和测试中也可以正常工作,但在修补程序中,它的行为如上所述。在这种情况下,您可以尝试清除laravel应用程序缓存。这是命令。

php artisan cache:clear 
php artisan config:clear
php artisan route:clear

这将清除所有缓存。然后我可以使用工厂创建模型实例。

>>> factory(User::class)->create() // or
>>> factory(Book::class)->create()

答案 1 :(得分:0)

由于错误状态,您需要一个默认工厂。请比较以下两个:

$factory->define(App\User::class, function (Faker\Generator $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->safeEmail,
        'password' => bcrypt(str_random(10)),
        'remember_token' => $faker->randomNumber(),
    ];
});

$factory->state(App\User::class, 'test_state', function (Faker\Generator $faker) {
    return [
        'name' => 'Namoshek',
        'email' => 'namoshek@example.com',
    ];
});

第一个定义是用户未给出状态时的默认工厂。您可以使用factory(App\User::class, 10)->create()进行调用,其中10是可选的,以提供要创建的模型数量。

您也可以在调用->states('test_state')之后链接factory():  factory(App\User::class)->states('test_state')->create(),它将首先运行默认工厂,然后将给定状态定义的更改应用于模型。但是您始终需要一个默认工厂,否则系统将不知道将状态应用于何处和什么。

顺便说一下,->create()->make()之间是有区别的。后者仅创建模型而不将其持久化在数据库中,而第一个模型则持久化它们。因此->create()等同于->make()->save()