Laravel Jetstream 1.0 チーム

イントロダクション

Jetstreamをteamsオプション付きでインストールしている場合、アプリケーションにチーム作成と管理をサポートするスカフォールドが作られます。

laravel new project-name --jet --teams

Jetstreamのチームスカフォールドとオプションは、すべてのアプリケーションの要求を満たすものではありません。皆さんのユースケースで役立たない場合は、チームベースではないJetstreamアプリケーションを作成し、チーム機能をアプリケーションへ自分で追加してください。

Jetstreamのチーム機能は各登録済みユーザーに複数のチームを作成/所属できるようにします。デフォルトでは登録ユーザーは「個人の」チームに所属します。たとえば、"Sally Jones"と言う名前のユーザーが新しいアカウントを作ると、Sally's Teamと言う名前のチームへ所属します。登録後、そのユーザーはこのチームの名前を変えるか、新しいチームを追加できます。

Screenshot of Laravel Teams

チームの作成/削除

右上のユーザーナビにあるドロップダウンメニューから、チーム作成ビューへアクセスできます。

ビュー/ページ

Livewireスタックの使用時は、resources/views/teams/create-team-form.blade.php Bladeテンプレートを使用し、チーム作成ビューを表示します。Inertiaスタックの使用時は、resources/js/Pages/Teams/CreateTeamForm.vueテンプレートを使用し、このビューを表示します。

アクション

チーム作成と削除のロジックは、app/Actions/Jetstreamディレクトリの中の関連するアクションクラスを変更することでカスタマイズできます。これらのアクションはCreateTeamUpdateTeamNameDeleteTeamです。これらのアクションはそれぞれ対応するタスクがアプリケーションのUIでユーザーが実行された時に起動されます。アプリケーションの必要に合わせ、こうしたアクションは自由に変更できます。

ユーザーチームの調査

ユーザーのチームの情報は、アプリケーションのLaravel\Jetstream\HasTeamsトレイトが提供するメソッドによりアクセスできます。このトレイトはJetstreamのインストール時に自動的にApp\Models\Userモデルへ適用されます。このトレイトはユーザーのチームを調べるための多種の便利なメソッドを提供します。

// ユーザーが現在選んでいるチームへアクセス
$user->currentTeam : Laravel\Jetstream\Team

// 自分が所属しているものも含めたユーザーが所属してる全チームへアクセス
$user->allTeams() : Illuminate\Support\Collection

// ユーザーが所有するチームへアクセス
$user->ownedTeams : Illuminate\Database\Eloquent\Collection

// 自分で所有していないが、所属してる全チームへアクセス
$user->teams : Illuminate\Database\Eloquent\Collection

// ユーザーの「個人的」なチームへアクセス
$user->personalTeam() : Laravel\Jetstream\Team

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

// ユーザーが指定したチームを所有しているか判定
$user->belongsToTeam($team) : bool

// ユーザーがそのチームでアサインされているロールを取得
$user->teamRole($team) : \Laravel\Jetstream\Role

// ユーザーが指定チームの指定ロールを持っているか判定
$user->hasTeamRole($team, 'admin') : bool

// ユーザーが指定したチームへ持っている全パーミッションのリスト
$user->teamPermissions($team) : array

// ユーザーが指定パーミンションを持っているか判定
$user->hasTeamPermission($team, 'server:create') : bool

現在のチーム

Jetstreamアプリケーションの中ではすべてのユーザーが「現在のチーム」を持っています。これはそのユーザーが積極的にリソースを閲覧しているチームのことです。たとえば、カレンダーアプリケーションを構築中であれば、あなたのアプリケーションは現在のチームのユーザーによるカレンダーイベントのうち、これから行うものを表示したいでしょう。

$user->currentTeam Eloquentリレーションを使用すれば、ユーザーの現在のチームへアクセスできます。このチームは他のEloquentクエリをチームでスコープするために使用できます。

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

ユーザーはJetstreamのナビバーの中から使用できるユーザープロフィールのドロップダウンメニューにより、現在のチームを切り替えできます。

Screenshot of Team Switcher

チームオブジェクト

チームオブジェクトへは$user->currentTeam、もしくはチームの属性とリレーションを調べるための便利なメソッドを各種提供しているEloquentクエリによりアクセスできます。

// チームのオーナへアクセス
$team->owner : \App\Models\User

// オーナーも含むチームの全ユーザーの取得
$team->allUsers() : Illuminate\Database\Eloquent\Collection

// オーナーを除く、チームの全ユーザーの取得
$team->users : Illuminate\Database\Eloquent\Collection

// 指定ユーザーがチームのメンバーであるか判定
$team->hasUser($user) : bool

// 指定したメールアドレスのメンバーがチームに所属しているか判定
$team->hasUserWithEmail($emailAddress) : bool

// 指定したユーザーが指定したパーミッションを持ったチームメンバーであるか判定
$team->userHasPermission($user, $permission) : bool

メンバー管理

チームメンバーはJetstreamの「チーム設定」ビューで追加と削除ができます。これらのアクションを管理するバックエンドのロジックは、App\Actions\Jetstream\AddTeamMemberクラスのような関連するアクションを変更することでカスタマイズできます。

メンバー管理ビュー/ページ

Livewireスタック使用時は、チームメンバー管理ビューをresources/views/teams/team-member-manager.blade.php Bladeテンプレートを使用し表示します。Inertiaスタック使用時は、resources/js/Pages/Teams/TeamMemberManager.vueテンプレートを使用してこのビューを表示します。一般的に、これらのテンプレートはカスタマイズすべきでないでしょう。

メンバー管理アクション

メンバーの追加ロジックはApp\Actions\Jetstream\AddTeamMemberアクションクラスを変更してカスタマイズします。このクラスのaddメソッドは現在の認証済みユーザー、Laravel\Jetstream\Teamインスタンス、チームへ追加するユーザーのメールアドレスとロール(使用時)を渡され、起動されます。

このアクションは実際にユーザーをチームへ追加できるのかを検証し、よければ追加する責務を持っています。アプリケーションの必要に応じ、このアクションを自由にカスタマイズしてください。

ロール/パーミッション

各チームメンバーは指定ロールを割り当てて、チームに追加します。割り付ける各ロールは1組のパーミッションです。ロールパーミッションはアプリケーションのJetstreamServiceProviderで、Jetstream::roleメソッドを使用して定義します。このメソッドはロールごとに「スラグ」、ユーザーフレンドリーなロール名、ロールパーミッション、ロールの説明を引数に取ります。この情報はチームメンバー管理ビューの中にロールを表示するために使用します。

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

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

Jetstream::role('editor', 'Editor', [
    'read',
    'create',
    'update',
])->description('Editor users have the ability to read, create, and update.');

Tip!! チームサポートを指定しJetstreamをインストールすると、ロールで利用可能な一意のパーミッションのすべての組み合わせとして、APIパーミッションを自動的に利用可能にします。そのため、Jetstream::permissionsメソッドを個別に呼び出す必要はありません。

認可

もちろんチームメンバーが発信したリクエストを受信したら、そのユーザーが実際に実行できるのかを認可する方法が必要になります。ユーザーのチームパーミッションはLaravel\Jetstream\HasTeamsトレイトによるhasTeamPermissionメソッドを使用し確認します。ユーザーのロールを検証する必要はまったくありません。そのユーザーが指定している粒度のパーミッションを持っていることを確認する必要があるだけです。ロールはパーミッションの粒度をグループ化するために使用する表現的な概念に過ぎません。通常は、アプリケーションの許可ポリシーの中で、このメソッドを呼び出します。

if ($request->user()->hasTeamPermission($team, 'read')) {
    // ユーザーは"read"パーミッションを含むロールを持っている
}

チームパーミッションとAPIパーミッションを組み合わせる

APIサポートとチームサポートの両者を提供するJetstreamアプリケーションの構築時、受信リクエストのチームパーミッションとAPIトークンパーミッションの「両方」をアプリケーションの認可ポリシーの中で検証しなくてはなりません。APIトークンにはアクションを実行する理論上のアビリティがあるかもしれませんが、ユーザーはチームパーミッションによりそのアクションを実行する権限を付与されているとは限らないため、これは重要です。

/**
 * ユーザーがフライトを観ることができるかを決める
 *
 * @param  \App\Models\User  $user
 * @param  \App\Models\Flight  $flight
 * @return bool
 */
public function view(User $user, Flight $flight)
{
    return $user->belongsToTeam($flight->team) &&
           $user->hasTeamPermission($flight->team, 'flight:view') &&
           $user->tokenCan('flight:view');
}

ドキュメント章別ページ

スタック

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

バージョン

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる