logo

团队

简介

如果你使用 --teams 选项安装了 Jetstream,你的应用程序将被构建为支持团队创建和管理。

Jetstream 的团队功能允许每个注册用户创建多个团队并加入其中。默认情况下,每个注册用户都将属于一个“个人”团队。例如,如果名为“Sally Jones”的用户创建了一个新帐户,他们将被分配到名为“Sally's Team”的团队。注册后,用户可以重命名此团队或创建其他团队。

Screenshot of Laravel Teams

Jetstream 团队

Jetstream 的团队构建和观点可能不适用于每个应用程序。如果它不适用于你的用例,请随时创建一个非基于团队的 Jetstream 应用程序,并根据自己的需要手动向应用程序添加团队功能。

团队创建

可以通过右上角用户导航下拉菜单访问团队创建视图。

操作

与许多其他 Jetstream 功能一样,可以通过修改 app/Actions/Jetstream 目录中的相关操作类来自定义团队创建和删除逻辑。这些操作包括 CreateTeamUpdateTeamNameDeleteTeam。当用户在应用程序的 UI 中执行相应的任务时,将调用这些操作中的每一个。你可以根据应用程序的需要自由修改这些操作。

视图/页面

使用 Livewire 栈时,将使用 resources/views/teams/create-team-form.blade.php Blade 模板显示团队创建视图。使用 Inertia 栈时,将使用 resources/js/Pages/Teams/CreateTeamForm.vue 模板显示此视图。当用户创建团队时,团队创建表单上指定的其他输入字段将提供给 App\Actions\Jetstream\CreateTeam 操作类。

检查用户团队

可以通过 Laravel\Jetstream\HasTeams 特性提供的方法访问有关用户团队的信息。Jetstream 安装期间,此特性会自动应用到应用程序的 App\Models\User 模型。此特性提供多种有用的方法,允许你检查用户团队

php
// Access a user's currently selected team...
$user->currentTeam : Laravel\Jetstream\Team

// Access all of the team's (including owned teams) that a user belongs to...
$user->allTeams() : Illuminate\Support\Collection

// Access all of a user's owned teams...
$user->ownedTeams : Illuminate\Database\Eloquent\Collection

// Access all of the teams that a user belongs to but does not own...
$user->teams : Illuminate\Database\Eloquent\Collection

// Access a user's "personal" team...
$user->personalTeam() : Laravel\Jetstream\Team

// Determine if a user owns a given team...
$user->ownsTeam($team) : bool

// Determine if a user belongs to a given team...
$user->belongsToTeam($team) : bool

// Get the role that the user is assigned on the team...
$user->teamRole($team) : \Laravel\Jetstream\Role

// Determine if the user has the given role on the given team...
$user->hasTeamRole($team, 'admin') : bool

// Access an array of all permissions a user has for a given team...
$user->teamPermissions($team) : array

// Determine if a user has a given team permission...
$user->hasTeamPermission($team, 'server:create') : bool

当前团队

Jetstream 应用程序中的每个用户都有一个“当前团队”。这是用户正在主动查看资源的团队。例如,如果你正在构建日历应用程序,则应用程序会显示用户当前团队的即将到来的日历事件。

你可以使用 $user->currentTeam Eloquent 关系访问用户的当前团队。此关系可用于按用户的当前团队限定你的其他 Eloquent 查询

php
use App\Models\Calendar;

return Calendar::where(
    'team_id', $request->user()->currentTeam->id
)->get();

切换团队

用户可以通过 Jetstream 导航栏中提供的“团队切换器”菜单切换其当前团队。

团队对象

通过 $user->currentTeam 或 Jetstream 的其他与团队相关的 Eloquent 查询访问的团队对象提供了多种有用的方法,用于检查团队的属性和关系

php
// Access the team's owner...
$team->owner : App\Models\User

// Get all of the team's users, including the owner...
$team->allUsers() : Illuminate\Database\Eloquent\Collection

// Get all of the team's users, excluding the owner...
$team->users : Illuminate\Database\Eloquent\Collection

// Determine if the given user is a team member...
$team->hasUser($user) : bool

// Determine if the team has a member with the given email address...
$team->hasUserWithEmail($emailAddress) : bool

// Determine if the given user is a team member with the given permission...
$team->userHasPermission($user, $permission) : bool

成员管理

可以通过 Jetstream 的“团队设置”视图向团队添加和删除团队成员。默认情况下,只有团队所有者可以管理团队成员资格。此限制在 App\Policies\TeamPolicy 类中定义。当然,你可以根据需要修改此策略。

成员管理操作

与其他 Jetstream 功能的自定义流程类似,可通过修改 App\Actions\Jetstream\AddTeamMember 操作类来自定义团队成员添加逻辑。该类的 add 方法使用当前经过身份验证的用户、Laravel\Jetstream\Team 实例、将添加到团队的用户电子邮件地址以及将添加到团队的用户的角色(如果适用)进行调用。

此操作负责验证用户是否确实可以添加到团队,然后将用户添加到团队。你可以根据特定应用程序的需求来自定义此操作。

可通过修改 App\Actions\Jetstream\RemoveTeamMember 操作类来自定义团队成员移除。

成员管理视图/页面

使用 Livewire 堆栈时,将使用 resources/views/teams/team-member-manager.blade.php Blade 模板显示团队成员管理器视图。使用 Inertia 堆栈时,将使用 resources/js/Pages/Teams/TeamMemberManager.vue 模板显示此视图。通常,这些模板不需要自定义。

邀请

默认情况下,Jetstream 会将你指定的任何现有应用程序用户简单添加到你的团队。但是,许多应用程序选择向被邀请加入团队的用户发送邀请电子邮件。如果用户没有帐户,邀请电子邮件可以指示他们创建帐户并接受邀请。或者,如果用户已有帐户,他们可以接受或忽略邀请。

值得庆幸的是,Jetstream 允许你仅使用几行代码为你的应用程序启用团队成员邀请。要开始,在为你的应用程序启用“团队”功能时传递 invitations 选项。这可以通过修改应用程序的 config/jetstream.php 配置文件的 features 数组来完成

php
use Laravel\Jetstream\Features;

'features' => [
    Features::termsAndPrivacyPolicy(),
    Features::profilePhotos(),
    Features::api(),
    Features::teams(['invitations' => true]),
    Features::accountDeletion(),
],

启用 Jetstream 的邀请功能后,被邀请加入团队的用户将收到一封邀请电子邮件,其中包含接受团队邀请的链接。在接受邀请之前,用户不会成为团队的正式成员。

邀请操作

当用户被邀请加入团队时,你的应用程序的 App\Actions\Jetstream\InviteTeamMember 操作将被调用,并带有当前经过身份验证的用户、新用户受邀加入的团队、受邀用户的电子邮件地址,以及可选地,一旦用户加入团队后应分配给用户的角色。你可以自由地查看此操作或根据你自己的应用程序的需求对其进行修改。

Laravel 邮件

在使用团队邀请功能之前,你应该确保你的 Laravel 应用程序已配置为 发送电子邮件。否则,Laravel 将无法向你应用程序的用户发送团队邀请电子邮件。

角色/权限

添加到团队的每个团队成员都可以分配一个给定的角色,并且每个角色都分配了一组权限。角色权限在应用程序的 App\Providers\JetstreamServiceProvider 类中使用 Jetstream::role 方法定义。此方法接受角色的“缩写”,一个用户友好的角色名称,角色权限和角色描述。此信息将用于在团队成员管理视图中显示角色。

例如,想象一下我们正在构建一个服务器管理应用程序,例如 Laravel Forge。我们可以这样定义我们应用程序的团队角色

php
Jetstream::defaultApiTokenPermissions(['read']);

Jetstream::role('admin', 'Administrator', [
    'server:create',
    'server:read',
    'server:update',
    'server:delete',
])->description('Administrator users can perform any action.');

Jetstream::role('support', 'Support Specialist', [
    'server:read',
])->description('Support specialists can read server information.');

团队 API 支持

当 Jetstream 与团队支持一起安装时,可用的 API 权限将通过组合可用于角色的所有唯一权限自动派生。因此,无需单独调用 Jetstream::permissions 方法。

授权

当然,你需要一种方法来授权由团队成员发起的传入请求实际上可以由该用户执行。可以使用通过 Laravel\Jetstream\HasTeams 特性提供的 hasTeamPermission 方法检查用户的团队权限。

通常不需要检查用户的角色。你只需要检查用户是否具有给定的细粒度权限。 角色只是一个用于对细粒度权限进行分组的表示概念。通常,你将在应用程序的 授权策略 中执行对该方法的调用

php
return $user->hasTeamPermission($server->team, 'server:update');

将团队权限与 API 权限相结合

在构建同时提供 API 支持和团队支持的 Jetstream 应用程序时,你应该在应用程序的授权策略中验证传入请求的团队权限API 令牌权限。这一点很重要,因为 API 令牌可能具有执行某项操作的理论能力,而用户实际上并未通过其团队权限授予该操作

php
/**
 * Determine whether the user can view a flight.
 */
public function view(User $user, Flight $flight): bool
{
    return $user->belongsToTeam($flight->team) &&
           $user->hasTeamPermission($flight->team, 'flight:view') &&
           $user->tokenCan('flight:view');
}