To manage teams in multi-tenant apps in Laravel, you can use a package like Laravel Teamwork to handle team-based permissions, team ownership, and switching between teams.
Step 1: Install Laravel Teamwork Package
First, install the Laravel Teamwork package via Composer:
bash
1 |
composer require mpociot/teamwork |
Step 2: Publish Configuration and Migration Files
Publish the configuration file and migration files using the following command:
bash
1 |
php artisan vendor:publish --provider="Mpociot\Teamwork\TeamworkServiceProvider" |
This will publish the necessary configuration file config/teamwork.php
and the migration files to create teams and team-user relationships.
Step 3: Run Migrations
Run the migration to create the required tables for managing teams:
bash
1 |
php artisan migrate |
This will create the following tables:
teams
: Stores team details (name, owner, etc.)team_user
: Pivot table for many-to-many relationship between users and teamsinvitations
: Stores team invitations for users who are invited to join a team
Step 4: Add the Teamwork Trait to the User Model
To enable team functionality, add the Teamwork trait to your User model. Open app/Models/User.php
and update it as follows:
php
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; use Mpociot\Teamwork\Traits\UserHasTeams; class User extends Authenticatable { use UserHasTeams; // Other model methods and properties... } |
This will allow users to join teams, switch teams, and manage team relationships.
Step 5: Create a Team Model
Next, you need to create a Team model to represent the teams in your application. Run the following Artisan command to create the Team model:
bash
1 |
php artisan make:model Team |
In app/Models/Team.php
, add the following code to define the team relationships:
php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Mpociot\Teamwork\TeamworkTeam; class Team extends Model { use TeamworkTeam; protected $fillable = ['name', 'owner_id']; // A team has many users public function users() { return $this->belongsToMany(User::class); } // A team belongs to an owner (User) public function owner() { return $this->belongsTo(User::class, 'owner_id'); } } |
Step 6: Create Teams and Assign Users
You can now create teams and assign users to them using the provided methods.
Example: Creating a Team
To create a team and assign a user as the owner:
php
1 2 3 4 5 6 7 8 9 10 11 12 |
use App\Models\User; use App\Models\Team; $user = User::find(1); // Find the user who will own the team $team = Team::create([ 'name' => 'Development Team', 'owner_id' => $user->id, ]); // Assign the user to the team $user->attachTeam($team); |
Example: Add User to a Team
To add another user to the team:
php
1 2 3 4 |
$team = Team::find(1); // Find the team $user = User::find(2); // Find the user to be added to the team $team->users()->attach($user->id); |
Step 7: Handle Team Invitations (Optional)
The Laravel Teamwork package provides a built-in way to handle team invitations. To invite a user to a team, you can use the Teamwork::inviteToTeam()
method.
Example: Inviting a User to a Team
php
1 2 3 4 5 6 7 8 9 10 |
use Mpociot\Teamwork\Facades\Teamwork; use App\Models\Team; $team = Team::find(1); // Find the team $email = 'invitee@example.com'; // Email of the user to invite Teamwork::inviteToTeam($email, $team, function ($invite) { // Handle the invitation (e.g., send email to the user) Mail::to($invite->email)->send(new TeamInvitation($invite)); }); |
Example: Accepting an Invitation
Once a user receives the invitation, they can accept it by following a link (usually embedded in the invitation email). Here’s how you can handle invitation acceptance:
php
1 2 3 4 |
use Mpociot\Teamwork\TeamInvite; $invite = TeamInvite::where('token', $request->token)->first(); $invite->accept(); |
Step 8: Switching Between Teams
Since a user can belong to multiple teams, Laravel Teamwork provides methods to switch between teams easily.
Example: Switch Team
To switch the current team for a user:
php
1 2 3 4 |
$user = Auth::user(); $team = Team::find(1); // The team the user wants to switch to $user->switchTeam($team); |
This will set the current active team for the user in the session.
Step 9: Middleware for Team-based Authorization
You can use the team-based middleware provided by Laravel Teamwork to restrict access to certain routes or resources based on the user’s current team.
Example: Middleware to Ensure User Belongs to a Team
In your routes/web.php
file, you can apply the team
middleware:
php
1 2 3 4 5 |
Route::middleware(['auth', 'team'])->group(function () { Route::get('/dashboard', function () { return view('dashboard'); }); }); |
You can customize the middleware to ensure that users have the right roles within a team or access to specific teams.
Step 10: Displaying Teams and Users in Views
You can display the teams a user belongs to, their current team, and allow them to switch teams in your views.
Example: Display User’s Teams
php
1 2 3 |
@foreach(Auth::user()->teams as $team) <li>{{ $team->name }}</li> @endforeach |
Example: Show Current Team
php
1 2 3 |
@if(Auth::user()->currentTeam) <p>Current Team: {{ Auth::user()->currentTeam->name }}</p> @endif |
Example: Switch Team Form
You can create a simple form to allow users to switch teams:
php
1 2 3 4 5 6 7 8 9 |
<form action="{{ route('teams.switch') }}" method="POST"> @csrf <select name="team_id"> @foreach(Auth::user()->teams as $team) <option value="{{ $team->id }}">{{ $team->name }}</option> @endforeach </select> <button type="submit">Switch Team</button> </form> |
In your controller, handle the team switch logic:
php
1 2 3 4 5 6 7 |
public function switchTeam(Request $request) { $team = Team::find($request->team_id); Auth::user()->switchTeam($team); return redirect()->back(); } |
Step 11: Customize Teamwork Configuration (Optional)
You can customize how teams work in your application by editing the config/teamwork.php
file, which was published earlier. You can adjust the model names, table names, and other team-related settings.
Summary
With Laravel Teamwork, you can efficiently manage teams within your multi-tenant application, allowing users to belong to multiple teams, switch teams, and handle team-based permissions. Here’s a quick recap of the steps:
- Install Laravel Teamwork via Composer.
- Run migrations to create the necessary tables.
- Add the Teamwork trait to the User model.
- Create teams and assign users.
- Handle team invitations.
- Allow users to switch between teams.
- Use middleware to enforce team-based authorization.
- Laravel Breeze – Simple authentication starter kit
- Laravel Jetstream – Scaffolding for Laravel apps
- Laravel Passport – API authentication via OAuth2
- Laravel Sanctum – Simple API authentication
- Spatie Laravel Permission – Role and permission management
- Laravel Cashier – Subscription billing with Stripe
- Laravel Scout – Full-text search using Algolia
- Laravel Socialite – OAuth authentication (Google, Facebook, etc.)
- Laravel Excel – Excel import and export for Laravel
- Laravel Horizon – Redis queues monitoring
- Laravel Nova – Admin panel for Laravel
- Laravel Fortify – Backend authentication for Laravel
- Laravel Vapor – Serverless deployment on AWS
- Laravel Telescope – Debugging assistant for Laravel
- Laravel Dusk – Browser testing
- Laravel Mix – API for compiling assets
- Spatie Laravel Backup – Backup management
- Laravel Livewire – Building dynamic UIs
- Spatie Laravel Media Library – Manage media uploads
- Laravel Excel – Excel spreadsheet handling
- Laravel Debugbar – Debug tool for Laravel
- Laravel WebSockets – Real-time communication
- Spatie Laravel Sitemap – Generate sitemaps
- Laravel Spark – SaaS scaffolding
- Laravel Envoy – Task runner for deployment
- Spatie Laravel Translatable – Multilingual model support
- Laravel Backpack – Admin panel
- Laravel AdminLTE – Admin interface template
- Laravel Collective Forms & HTML – Simplified form and HTML generation
- Spatie Laravel Analytics – Google Analytics integration
- Laravel Eloquent Sluggable – Automatically create slugs
- Laravel Charts – Chart integration
- Laravel Auditing – Track changes in models
- Laravel JWT Auth – JSON Web Token authentication
- Laravel Queue Monitor – Monitor job queues
- Spatie Laravel Query Builder – Filter, sort, and include relationships in Eloquent queries
- Laravel Datatables – jQuery Datatables API
- Laravel Localization – Multilingual support for views and routes
- Laravel Acl Manager – Access control list manager
- Laravel Activity Log – Record activity in your app
- Laravel Roles – Role-based access control
- Spatie Laravel Tags – Tagging models
- Laravel Installer – CLI installer for Laravel
- Laravel Breadcrumbs – Generate breadcrumbs in Laravel
- Laravel Mailgun – Mailgun integration for Laravel
- Laravel Trustup Model History – Store model change history
- Laravel Deployer – Deployment automation tool
- Laravel Auth – Custom authentication guards
- Laravel CORS – Cross-Origin Resource Sharing (CORS) support
- Laravel Notifications – Send notifications through multiple channels
- Spatie Laravel Http Logger – Log HTTP requests
- Laravel Permission Manager – Manage permissions easily
- Laravel Stubs – Customize default stubs in Laravel
- Laravel Fast Excel – Speed up Excel exports
- Laravel Image – Image processing
- Spatie Laravel Backup Server – Centralize backups for Laravel apps
- Laravel Forge API – Manage servers through the Forge API
- Laravel Blade SVG – Use SVGs in Blade templates
- Laravel Ban – Ban/unban users from your application
- Laravel API Response – Standardize API responses
- Laravel SEO – Manage SEO meta tags
- Laravel Settings – Store and retrieve settings
- Laravel DOMPDF – Generate PDFs
- Laravel Turbo – Full-stack framework for building modern web apps
- Spatie Laravel Event Sourcing – Event sourcing implementation
- Laravel Jetstream Inertia – Jetstream’s Inertia.js integration
- Laravel Envoy Tasks – Task automation
- Laravel Likeable – Like/dislike functionality
- Laravel GeoIP – Determine visitor’s geographic location
- Laravel Country State City – Dropdowns for country, state, and city
- Laravel Hashids – Generate short unique hashes
- Laravel Repository – Repository pattern for Laravel
- Laravel UUID – UUID generation for models
- Spatie Laravel Medialibrary Pro – Enhanced media management
- Laravel Queue Monitor – Monitor Laravel job queues
- Laravel User Activity – Monitor user activity
- Laravel DB Snapshots – Create database snapshots
- Laravel Twilio – Twilio integration
- Laravel Roles – Role-based permission handling
- Laravel Translatable – Add translations to Eloquent models
- Laravel Teamwork – Manage teams in multi-tenant apps
- Laravel Full Text Search – Add full-text search to Laravel models
- Laravel File Manager – File and media management
- Laravel User Timezones – Automatically detect user time zones
- Laravel ChartsJS – Render charts with ChartsJS
- Laravel Stripe – Stripe API integration
- Laravel PDF Generator – PDF generation
- Laravel Elasticsearch – Elasticsearch integration
- Laravel Simple Qrcode – Generate QR codes
- Laravel Timezone – Manage timezones and conversions
- Laravel Collective API – API management for Laravel
- Laravel Rest API Boilerplate – REST API starter kit
- Laravel Multi Auth – Multi-authentication functionality
- Laravel Voyager – Admin panel for Laravel
- Laravel Voyager Database – Database manager for Voyager
- Laravel Categories – Handle categories for models
- Laravel Multitenancy – Multi-tenancy implementation
- Laravel Access Control – Advanced access control for users
- Laravel Menus – Menu management
- Laravel Translatable Routes – Multilingual route handling