首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拉威尔8动力模型工厂?

拉威尔8动力模型工厂?
EN

Stack Overflow用户
提问于 2021-01-03 04:56:01
回答 1查看 842关注 0票数 6

我正在尝试创建一个包,该包允许在模型类本身内指定模型工厂定义。

例如:

代码语言:javascript
复制
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

代码语言:javascript
复制
trait LaravelUIModel
{
    use HasFactory;

    protected static function newFactory()
    {
        $factory = new Factory;
        $factory->setModel(static::class);

        return $factory->new();
    }
}

现在,属性化的$model工厂是受保护的,所以我创建了自己的Factory类来扩展雄辩的Factory类,这应该允许我修改它:

代码语言:javascript
复制
class Factory extends EloquentFactory
{
    public function setModel($model)
    {
        $this->model = $model;
    }

    public function definition()
    {
        return app($this->model)->definition($this->faker);
    }
}

我一直在犯这个错误:

代码语言:javascript
复制
Class "App\" not found

就好像我根本没有意识到我已经设置了模型名称,因为当我打印$this->model时,它会向我显示App\Models\User

如何像这样动态地设置工厂$model,以便可以在模型类中指定定义,而无需为每个模型创建一个新的工厂文件?

EN

回答 1

Stack Overflow用户

发布于 2022-02-08 12:51:36

我通过创造这样的特性来做到这一点:

代码语言:javascript
复制
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特性:

代码语言:javascript
复制
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(),
        ];
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65546771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档