我正在使用[Nwidart][1]模块包,并试图使用工厂创建一个播种机。但是当我尝试运行php artisan db:seed
时,我得到了这个错误
调用未定义的函数Modules\Products\Database\Siders\factory((
这是我的产品DatabaseSeeder.php
<?php
namespace ModulesProductsDatabaseSeeders;
use IlluminateDatabaseSeeder;
use IlluminateDatabaseEloquentModel;
use ModulesProductsModelsProduct;
class ProductsDatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Model::unguard();
factory(Product::class, 10)->create();
}
}
我的产品工厂
<?php
/** @var IlluminateDatabaseEloquentFactory $factory */
use FakerGenerator as Faker;
use ModulesProductsModelsProduct;
$factory->define(Product::class, function (Faker $faker) {
return [
'title' => $this->faker->title,
'price' => $this->faker->randomNumber(3),
];
});
我的产品.php
<?php
namespace ModulesProductsModels;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
class Product extends Model
{
use HasFactory;
protected $fillable = [];
}
全错误
Call to undefined function ModulesProductsDatabaseSeedersfactory()
at Modules/Products/Database/Seeders/ProductsDatabaseSeeder.php:25
21▕
22▕
23▕
24▕
➜ 25▕ $product = factory(Product::class, 10)->create();
26▕
27▕
28▕ }
29▕ }
+8 vendor frames
9 database/seeders/DatabaseSeeder.php:20
IlluminateDatabaseSeeder::call()
+24 vendor frames
34 artisan:37
IlluminateFoundationConsoleKernel::handle()
这是我更换后得到的
factory(Product::class, 10)->create();
至
Product::factory()->count(10)->create();
Class 'DatabaseFactoriesModulesProductsModelsProductFactory' not found
at vendor/laravel/framework/src/Illuminate/Database/Eloquent/Factories/Factory.php:656
652▕ public static function factoryForModel(string $modelName)
653▕ {
654▕ $factory = static::resolveFactoryName($modelName);
655▕
➜ 656▕ return $factory::new();
657▕ }
658▕
659▕ /**
660▕ * Specify the callback that should be invoked to guess factory names based on dynamic relationship names.
+1 vendor frames
2 Modules/Products/Database/Seeders/ProductsDatabaseSeeder.php:25
ModulesProductsModelsProduct::factory()
+8 vendor frames
11 database/seeders/DatabaseSeeder.php:21
IlluminateDatabaseSeeder::call()
[1]: https://nwidart.com/laravel-modules/v6/introduction
从Laravel 8开始,你可能会使用它——因为你正在使用HasFactory特性——你需要调用
Product::factory()->create()
为了运行工厂
https://laracasts.com/discuss/channels/code-review/please-help-call-to-undefined-function-factory?signup
除了将HasFactory特性添加到模型中之外,为了支持Modules{Module}命名空间,您还需要将其放入模型中:
/**
* Create a new factory instance for the model.
*
* @return IlluminateDatabaseEloquentFactoriesFactory
*/
protected static function newFactory()
{
return ModulesModuleDatabaseFactoriesModelFactory::new();
}
因此,在您的模型Product.php 中
<?php
namespace ModulesProductsModels;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
class Product extends Model
{
use HasFactory;
/**
* Create a new factory instance for the model.
*
* @return IlluminateDatabaseEloquentFactoriesFactory
*/
protected static function newFactory()
{
return ModulesProductsDatabaseFactoriesProductFactory::new();
}
protected $fillable = [];
}
此外,自拉拉维尔8以来,使用工厂的惯例也发生了变化。所以,在你的
产品数据库种子.php
<?php
namespace ModulesProductsDatabaseSeeders;
use IlluminateDatabaseSeeder;
use IlluminateDatabaseEloquentModel;
use ModulesProductsModelsProduct;
class ProductsDatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Model::unguard();
Product::factory()->count(50)->create();
}
}
最后是类似的工厂级ProductFactory.php
<?php
namespace ModulesProductsDatabaseFactories;
use IlluminateDatabaseEloquentFactoriesFactory;
use ModulesProductsModelsProduct;
class ProductFactory extends Factory
{
protected $model = Product::class;
public function definition()
{
return [
'title' => $this->faker->title,
'price' => $this->faker->randomNumber(3),
];
}
}