【问题标题】:How to use a boot() in laravel model?如何在 laravel 模型中使用 boot()?
【发布时间】:2021-12-03 01:40:58
【问题描述】:

我有两个模型和迁移表,分别命名为 usersroles(用于迁移和模型名称)。

这是我第一次使用boot()。我有一个疑问:如果用户成功注册,那么他的角色应该以管理员身份自动存储在roles 表中,为此请帮助我,我正在尝试一些不起作用的方法。

User.php

public static function boot()
{
    parent::boot();
    Static::updating(function (){});
    // Here I am unable to figure out how to pass roles model or migration take data and how to update the values
}

create_roles_table.php

$table->string('role');
$table->unsignedInteger('user_id');
$table->foriegn('user_id')->references ('id')->on('users');

【问题讨论】:

    标签: laravel events model laravel-events


    【解决方案1】:

    许多用户都可以是“管理员”,是吗?那么roles表应该有如下结构。

    // create_roles_table
    $table->id();
    $table->string('role'); // Admin, Manager, etc
    $table->timestamps();
    

    如果一个用户只能拥有一个角色,那么users 表应该有一个roles 表的外键。

    // create_users_table
    $table->id();
    // other fields
    $table->foreignId('role_id')->constrained('roles', 'id'); // equivalent to $table->unsignedBigInteger('role_id'); $table->foreign('role_id')->references('id')->on('roles');
    

    当用户注册时,laravel 触发事件Illuminate\Auth\Events\Registered

    您可以在 App/Providers/EventServiceProvider 课堂上收听。

    use Illuminate\Auth\Events\Registered;
    use Illuminate\Support\Facades\Event;
    
    class EventServiceProvider extends ServiceProvider
    {
        public function boot()
        {
            // Will fire every time an User registers
            Event::listen(function (Registered $event) {
                $event->user->forceFill(['role_id' => ADMIN_ROLE_ID])->save();
            });
        }
    }
    

    如果您想改用用户模型的事件,它应该如下所示:

    class User extends Model
    {
        public static function boot()
        {
            parent::boot();
            // Will fire everytime an User is created
            static::creating(function (User $user) {
                $user->forceFill(['role_id' => ADMIN_ROLE_ID])->save();
            });
        }
    }
    

    或改用booted()

    class User extends Model
    {
        public static function booted()
        {
            // Will fire every time an User is created
            static::creating(function ($user) {
                $user->forceFill(['role_id' => ADMIN_ROLE_ID])->save();
            });
        }
    }
    

    如果用户可以拥有多个角色,则需要单独迁移。 role_id 不再需要在 users 表上。

    // create_role_user_table
    $table->id()
    $table->foreignId('role_id')->constrained('roles', 'id');
    $table->foreignId('user_id')->constrained('users', 'id');
    

    那么你需要在UserRole两个模型中定义一个关系

    // User
    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
    
    // Role
    public function users()
    {
        return $this->belongsToMany(User::class);
    }
    

    至于在创建/注册用户时更新角色为用户,替换

    user->forceFill(['role_id' => ADMIN_ROLE_ID])->save()
    

    通过

    user->roles()->attach(ADMIN_ROLE_ID);
    

    【讨论】:

    • 是的,很多用户都可以管理。当用户注册时,当我使用 boot() 方法时,角色应该存储在角色表中
    • 如果用户有多个角色,迁移的样子
    • 关系变成M:N。您需要一个单独的数据透视表(role_user:id、role_id、user_id),而不是在用户中使用 role_id。
    • 感谢您的回答和很好的解释?
    猜你喜欢
    • 2020-10-17
    • 2017-05-26
    • 1970-01-01
    • 2017-07-09
    • 2014-03-25
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 2013-09-25
    相关资源
    最近更新 更多