Laravel Jetstream - 如何在注册时加入默认团队
Laravel Jetstream - How to join a default team at registration
我正在尝试更改 Laravel Jetstream 的逻辑,以便在注册时加入默认团队而不是创建个人团队。我找到了执行此操作的方法:
public function create(array $input)
{
Validator::make($input, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => $this->passwordRules(),
'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['required', 'accepted'] : '',
])->validate();
return DB::transaction(function () use ($input) {
return tap(User::create([
'name' => $input['name'],
'email' => $input['email'],
'password' => Hash::make($input['password']),
]), function (User $user) {
$user->currentTeam = Team::find(1); # SQLSTATE[42S22]: Column not found: 1054 Unknown column 'currentTeam' in 'field list'
$user->save();
});
});
}
这里的问题是 currentTeam
似乎是在数据库级别之后创建的,而不是数据库本身的列。 documentation 表示 currentTeam
returns Team
模型但没有说明如何以编程方式更新当前用户团队。
我知道我可以手动使用数据库查询在 team_user
table 中插入一行,但必须有一种方法可以做到这一点。
return DB::transaction(function () use ($input) {
return tap(User::create([
'name' => $input['name'],
'email' => $input['email'],
'password' => Hash::make($input['password']),
]), function (User $user) {
DB::table('team_user')->insert(['user_id' => $user->id, 'team_id' => 1, 'role' => 'rfn']);
$user->current_team_id = 1;
});
});
任何帮助将不胜感激,我知道这将依赖于这个始终存在于数据库中的团队,但将实施进一步的措施以使其无法删除。
在对本地 Laravel 版本进行一些修改之后,这是我想出的。这假设您想要将用户添加到的团队已经以某种方式创建,可能是通过播种机创建的,或者是手动创建的。您需要编辑的文件是app/Actions/Fortify/CreateNewUser.php
,即createTeam
方法。
我们不想创建新团队,而是想从数据库中获取一个团队,将其附加到新注册的用户,然后使现在附加的团队成为用户的当前团队。
protected function createTeam(User $user)
{
$team = Team::first();
$user->teams()->attach($team);
$user->switchTeam($team);
}
我们首先需要先附加团队的原因是 switchTeam
检查用户是否属于该团队,如果不属于该团队,则 returns false 并且不会切换到新团队团队。通过首先附加团队,我们让用户属于该团队,然后我们才能真正切换到它作为当前团队。
您也可以在@KimHallberg 的上述回答中分配角色,如下所示
$team = Team::first();
$user->teams()->attach($team, array('role' => 'editor'));
$user->switchTeam($team);
我正在尝试更改 Laravel Jetstream 的逻辑,以便在注册时加入默认团队而不是创建个人团队。我找到了执行此操作的方法:
public function create(array $input)
{
Validator::make($input, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => $this->passwordRules(),
'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['required', 'accepted'] : '',
])->validate();
return DB::transaction(function () use ($input) {
return tap(User::create([
'name' => $input['name'],
'email' => $input['email'],
'password' => Hash::make($input['password']),
]), function (User $user) {
$user->currentTeam = Team::find(1); # SQLSTATE[42S22]: Column not found: 1054 Unknown column 'currentTeam' in 'field list'
$user->save();
});
});
}
这里的问题是 currentTeam
似乎是在数据库级别之后创建的,而不是数据库本身的列。 documentation 表示 currentTeam
returns Team
模型但没有说明如何以编程方式更新当前用户团队。
我知道我可以手动使用数据库查询在 team_user
table 中插入一行,但必须有一种方法可以做到这一点。
return DB::transaction(function () use ($input) {
return tap(User::create([
'name' => $input['name'],
'email' => $input['email'],
'password' => Hash::make($input['password']),
]), function (User $user) {
DB::table('team_user')->insert(['user_id' => $user->id, 'team_id' => 1, 'role' => 'rfn']);
$user->current_team_id = 1;
});
});
任何帮助将不胜感激,我知道这将依赖于这个始终存在于数据库中的团队,但将实施进一步的措施以使其无法删除。
在对本地 Laravel 版本进行一些修改之后,这是我想出的。这假设您想要将用户添加到的团队已经以某种方式创建,可能是通过播种机创建的,或者是手动创建的。您需要编辑的文件是app/Actions/Fortify/CreateNewUser.php
,即createTeam
方法。
我们不想创建新团队,而是想从数据库中获取一个团队,将其附加到新注册的用户,然后使现在附加的团队成为用户的当前团队。
protected function createTeam(User $user)
{
$team = Team::first();
$user->teams()->attach($team);
$user->switchTeam($team);
}
我们首先需要先附加团队的原因是 switchTeam
检查用户是否属于该团队,如果不属于该团队,则 returns false 并且不会切换到新团队团队。通过首先附加团队,我们让用户属于该团队,然后我们才能真正切换到它作为当前团队。
您也可以在@KimHallberg 的上述回答中分配角色,如下所示
$team = Team::first();
$user->teams()->attach($team, array('role' => 'editor'));
$user->switchTeam($team);