我正在尝试创建一个包,该包允许在模型类本身内指定模型工厂定义。
例如:
class User extends Authenticatable
{
use LaravelUIModel, Notifiable;
protected $hidden = ['password', 'remember_token'];
protected $casts = ['email_verified_at' => 'datetime'];
public function definition(Generator $faker)
{
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'email_verified_at' => now(),
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'remember_token' => Str::random(10),
];
}
}因此,我创建了一个名为LaravelUIModel的特性,在这里我试图指定一个动态newFactory
trait LaravelUIModel
{
use HasFactory;
protected static function newFactory()
{
$factory = new Factory;
$factory->setModel(static::class);
return $factory->new();
}
}现在,属性化的$model工厂是受保护的,所以我创建了自己的Factory类来扩展雄辩的Factory类,这应该允许我修改它:
class Factory extends EloquentFactory
{
public function setModel($model)
{
$this->model = $model;
}
public function definition()
{
return app($this->model)->definition($this->faker);
}
}我一直在犯这个错误:
Class "App\" not found就好像我根本没有意识到我已经设置了模型名称,因为当我打印$this->model时,它会向我显示App\Models\User。
如何像这样动态地设置工厂$model,以便可以在模型类中指定定义,而无需为每个模型创建一个新的工厂文件?
发布于 2022-02-08 12:51:36
我通过创造这样的特性来做到这一点:
use Faker\Generator;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
trait HasNewFactory
{
use HasFactory;
protected static function newFactory()
{
$factory = new class extends Factory
{
public static $definition;
public function definition()
{
$definition = static::$definition;
return $definition($this->faker);
}
};
$factory::guessModelNamesUsing(function () {
return get_called_class();
});
$factory::$definition = function (Generator $faker) {
return (new static)->definition($faker);
};
return $factory;
}
}现在,在我的模型中,我没有使用HasFactory,而是使用了HasNewFactory特性:
use Diontron\Lucid\Traits\HasNewFactory;
use Faker\Generator;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Schema\Blueprint;
class MyModel extends Model
{
use HasNewFactory;
public function definition(Generator $faker)
{
return [
'name' => $faker->name(),
];
}
}https://stackoverflow.com/questions/65546771
复制相似问题