Courses

Roles and Permissions in Laravel 12

Clinic Owner: Switching Between Teams

You're reading a FREE PREVIEW of a PREMIUM course.
Summary of this lesson:
- Adding team selection to user registration
- Setting up team-aware middleware
- Implementing default role assignment
- Managing user-team relationships

Video Version of the Lesson

[Only for premium members]

Link to the repository

[Only for premium members]

The final feature related to the Teams is for the Clinic Owner to choose the current team if they have multiple clinics.

This choice will be visible in the top-right corner of the Laravel Breeze design, like this:

Now, the code.

First, the permission of WHO can change the team? We add a method to the Policy:

app/Policies/TeamPolicy.php

class TeamPolicy
{
// ...
 
public function changeTeam(User $user): bool
{
return $user->hasPermissionTo(Permission::SWITCH_TEAM);
}
}

Next is the Controller method, where we will use that changeTeam immediately. We will add that method into the same TeamController:

app/Http/Controllers/TeamController.php:

use App\Enums\Role;
use Symfony\Component\HttpFoundation\Response;
 
class TeamController extends Controller
{
public function changeCurrentTeam(int $teamId)
{
Gate::authorize('changeTeam', Team::class);
 
$team = auth()->user()->teams()->findOrFail($teamId);
 
if (! auth()->user()->belongsToTeam($team)) {
abort(Response::HTTP_FORBIDDEN);
}
 
// Change team
auth()->user()->update(['current_team_id' => $team->id]);
setPermissionsTeamId($team->id);
auth()->user()->unsetRelation('roles')->unsetRelation('permissions');
 
return redirect(route('dashboard'), Response::HTTP_SEE_OTHER);
}
}

Next, we add the Route for that method.

routes/web.php

Route::middleware('auth')->group(function () {
 
Route::resource('teams', TeamController::class)->only(['index', 'create', 'store']);
Route::get('team/change/{teamId}',
[TeamController::class, 'changeCurrentTeam'])
->name('team.change');
});

Finally, the front-end link to that Route. We just mimic the front-end code of the Profile dropdown...

The full lesson is only for Premium Members.
Want to access all 13 video+text lessons of this course? (57 min)

You also get:

  • 83 courses
  • Premium tutorials
  • Access to repositories
  • Private Discord