All packages
Teams for Laravel
Exceptions
Every exception lives in RoundlyConsulting\Teams\Exceptions and extends TeamsException, which extends RuntimeException. Catch the base type for any package error, or a specific one for targeted handling:
| Exception | Thrown by | When |
|---|---|---|
InviteExpiredException | AcceptInviteAction | The invite’s expires_at has passed. |
InviteExhaustedException | AcceptInviteAction | uses has reached max_uses — including a single-use invite already consumed. |
InviteEmailMismatchException | AcceptInviteAction | An email-targeted invite gets a different or missing email (compared case-insensitively). |
InviteNotFoundException | Teams::invites()->accept() | No invite matches the code, the invite was revoked, or its team was deleted. |
InviteNotFoundException | for($t)->invites()->resend() / revoke() | The invite belongs to another team. |
JoinRequestNotFoundException | for($t)->joinRequests()->approve() / deny() | The request belongs to another team. |
JoinRequestNotPendingException | for($t)->joinRequests()->approve() / deny() | The request was already approved, denied or expired — including by a concurrent responder. |
MemberNotFoundException | for($t)->members()->changeRole() | The model is not a member of the team. |
TeamsException | joinRequests()->open(), members()->add(), transferOwnershipTo() | The base class. Thrown directly for an invite-only team’s join request, a join request from an active member, and a reached seat limit. |
use RoundlyConsulting\Teams\Exceptions\InviteEmailMismatchException;
use RoundlyConsulting\Teams\Exceptions\InviteExhaustedException;
use RoundlyConsulting\Teams\Exceptions\InviteExpiredException;
use RoundlyConsulting\Teams\Exceptions\InviteNotFoundException;
use RoundlyConsulting\Teams\Exceptions\TeamsException;
try {
Teams::invites()->accept($code, $user, email: $user->email);
} catch (InviteExpiredException) {
// the link has expired
} catch (InviteExhaustedException) {
// no seats left, or a single-use link already consumed
} catch (InviteEmailMismatchException) {
// the wrong recipient
} catch (InviteNotFoundException) {
// an unknown code, a revoked invite or a deleted team
} catch (TeamsException $e) {
// any other teams error — e.g. a seat limit
}The invite checks run expired → exhausted → revoked → email mismatch → deleted team, so the first failing condition is the one you catch.
Translated messages
The invite, join-request and membership messages come from the teams:: translation namespace:
| Key | Default message |
|---|---|
teams::errors.already_member | The given model is already a member of team #:team. |
teams::errors.invite_expired | The invite ":code" has expired. |
teams::errors.invite_email_mismatch | This invite is addressed to ":email". |
teams::errors.invite_exhausted | The invite ":code" has reached its usage limit. |
teams::errors.invite_not_found | No invite was found for the code ":code". |
teams::errors.invite_team_missing | The team of invite #:id no longer exists. |
teams::errors.invite_unavailable | Invite #:id is no longer available. |
teams::errors.invite_not_in_team | Invite #:id does not belong to this team. |
teams::errors.join_request_not_pending | Join request #:id has already been resolved. |
teams::errors.join_request_not_in_team | Join request #:id does not belong to this team. |
teams::errors.member_not_found | The given model is not a member of team #:team. |
php artisan vendor:publish --tag="teams-translations"
# edit lang/vendor/teams/en/errors.php, or add other localesShow your open-source love
This package is free and MIT-licensed. If it saves you time, a one-off donation or a Patreon membership keeps it maintained, tested and documented.
More ways to support, including cryptoBy donating, you agree to our donation terms.
Want this built into your product?
We integrate our packages into custom Laravel and AI builds. Tell us what you're working on and we'll reply within 48 hours.