Laravel 5.8工厂状态无法找到名称为[default] [CLASS]的工厂

时间:2019-05-17 19:46:10

标签: laravel laravel-5 factory laravel-5.8 laravel-seeding

我正在尝试创建两组不同的播种机,并尝试使用Laravel的工厂状态为每个播种机指定不同的工厂。这是一个BoopieFactory的基本示例:

$factory
    ->state(App\Models\Boopie::class, 'one_flavored', function (Faker $faker) {
        return [];
    });

$factory
    ->state(App\Models\Boopie::class, 'two_flavored', function (Faker $faker) {
        return ['something different'];
    });

当时我的假设是我可以打电话给factory(\App\Models\Boopie::class, 25)->states('one_flavored')->create();factory(\App\Models\Boopie::class, 25)->states('two_flavored')->create();。这些会导致上述Unable to locate factory with name [default] [App\Models\Boopie].错误。我是否在这里遗漏了一些小东西,或者这仅仅是对工厂状态的完全误解?还是我还需要先定义工厂,然后再定义连锁状态? Laravel的文档通常很棒,但是这个部门却缺乏。我还查看了defineAs(未记载,但雄辩的源代码中),试图为具有不同返回值的同一类创建两个不同的别名。像这样:

$factory
    ->defineAs(App\Models\Boopie::class, 'OneFlavor', function (Faker $faker) {
        return [];
    });

$factory
    ->defineAs(App\Models\Boopie::class, 'TwoFlavor', function (Faker $faker) {
        return ['Something different'];
    });

然后,我试图像这样打电话:factory('OneFlavor', 25)->create();,并得到异常:Class 'OneFlavor' not found。也许还有另一种方法可以解决这个问题,或者我只是想念一些东西?我也尝试过这样嵌套它,虽然看起来更近了,但仍然有一个例外:Unable to locate [oneFlavor] state for [App\Models\Boopie].

$factory->define(App\Models\Boopie::class, function (Faker $faker) use ($factory) {
$factory->state(App\Models\Boopie::class, 'oneFlavor', function ($faker) {
    return [];
});

$factory->state(App\Models\Boopie::class, 'twoFlavor', function ($faker) {
    return ['Someting different'];
});
return [];

});

谢谢!

1 个答案:

答案 0 :(得分:0)

好,像这样解决:

add_filter('upload_dir', 'multisite_path');

function multisite_path( $param ){
    $path = str_replace('sites/2/', '', $param['path']);
    $url = str_replace('sites/2/', '', $param['url']);
    $param['path'] = $path;
    $param['url'] = $url;

    return $param;
}

您需要首先定义一个带有属性的默认工厂,然后您的各种状态可以为这些属性指定不同的值。