如何在 laravel 模型中使用 boot()?
How to use a boot() in laravel model?
我有两个模型和迁移 table 分别命名为 users
和 roles
(对于迁移和模型名称)。
这是我第一次使用boot()
。我有一个疑问:如果用户成功注册,那么他的角色应该作为管理员自动存储在 roles
table 中,为此请帮助我,我正在尝试一些它不起作用的方法。
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');
很多用户可以'admin',是吗?那么 roles
table 应该有下面的结构。
// create_roles_table
$table->id();
$table->string('role'); // Admin, Manager, etc
$table->timestamps();
如果一个用户只能有一个角色,那么 users
table 应该有一个指向 roles
table.
的外键
// 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
class.
中收听
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
table.
上
// create_role_user_table
$table->id()
$table->foreignId('role_id')->constrained('roles', 'id');
$table->foreignId('user_id')->constrained('users', 'id');
然后你需要在User
和Role
模型中定义一个关系
// User
public function roles()
{
return $this->belongsToMany(Role::class);
}
// Role
public function users()
{
return $this->belongsToMany(User::class);
}
至于当creating/registering一个用户一个用户时更新角色,替换
user->forceFill(['role_id' => ADMIN_ROLE_ID])->save()
来自
user->roles()->attach(ADMIN_ROLE_ID);
我有两个模型和迁移 table 分别命名为 users
和 roles
(对于迁移和模型名称)。
这是我第一次使用boot()
。我有一个疑问:如果用户成功注册,那么他的角色应该作为管理员自动存储在 roles
table 中,为此请帮助我,我正在尝试一些它不起作用的方法。
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');
很多用户可以'admin',是吗?那么 roles
table 应该有下面的结构。
// create_roles_table
$table->id();
$table->string('role'); // Admin, Manager, etc
$table->timestamps();
如果一个用户只能有一个角色,那么 users
table 应该有一个指向 roles
table.
// 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
class.
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
table.
// create_role_user_table
$table->id()
$table->foreignId('role_id')->constrained('roles', 'id');
$table->foreignId('user_id')->constrained('users', 'id');
然后你需要在User
和Role
模型中定义一个关系
// User
public function roles()
{
return $this->belongsToMany(Role::class);
}
// Role
public function users()
{
return $this->belongsToMany(User::class);
}
至于当creating/registering一个用户一个用户时更新角色,替换
user->forceFill(['role_id' => ADMIN_ROLE_ID])->save()
来自
user->roles()->attach(ADMIN_ROLE_ID);