Časovo obmedzené členstvo
Parametrom expiresAt udelíte dočasný prístup — externistom či na skúšobné obdobie. Po jeho uplynutí člen nemá žiadnu rolu, a teda ani oprávnenia, takže každá kontrola oprávnení cez Gate aj Blade prístup zamietne:
use RoundlyConsulting\Teams\Facades\Teams;
use RoundlyConsulting\Teams\Models\Member;
Teams::for($team)->members()->add($contractor, 'editor', expiresAt: now()->addDays(30));
$member = Teams::for($team)->members()->find($contractor);
$member->isExpired(); // true once expires_at has passed
$member->role(); // null once expired — no role, no permissions
Member::query()->active(); // not expired — and, with start dates on, started
Member::query()->unexpired(); // not expired, started or not — every taken or booked seat
Member::query()->upcoming(); // booked to start later (none while start dates are off)
Member::query()->expired(); // expires_at set and in the past
Member::query()->expiringWithin(7); // active, lapsing within 7 daysPo expirácii zlyhajú can('teams.…'), @teamPermission, @teamRole, memberHasRole(), hasTeamRole(), teamsWithRole() aj teamRole(). Zlyhajú aj hasActiveMember(), members()->hasActive(), isActiveMemberOf(), isAccessibleBy(), middleware teams.context, Teams::switchTo() a opätovné overenie členstva pri jobe vo fronte. Samotný riadok zostáva kvôli auditu až do odstránenia, takže kontroly riadku — zastarané hasMember() a members()->has() a tiež belongsToTeam() — ho stále nájdu.
Dátumy začiatku
Zapnite teams.members.start_dates (TEAMS_MEMBERS_START_DATES=true) po spustení migrácie starts_at — pozrite Inštalácia. Parametrom startsAt naplánujete členstvo, ktoré začne neskôr:
use RoundlyConsulting\Teams\Facades\Teams;
// .env → TEAMS_MEMBERS_START_DATES=true (after the starts_at migration ran)
Teams::for($team)->members()->add($hire, 'member', startsAt: now()->addWeek());
$team->addMember($hire, 'member', startsAt: $monday, expiresAt: $monday->copy()->addMonths(6));
$member = Teams::for($team)->members()->find($hire);
$member->hasStarted(); // false until starts_at
$member->isActive(); // false — no access, role or permission yet
Teams::for($team)->members()->hasActive($hire); // false until then- Do starts_at nemá člen žiadny prístup, rolu ani oprávnenie — každá vyššie uvedená kontrola zlyhá rovnako ako pri expirovanom členstve. Od starts_at (začiatok v minulosti alebo práve teraz sa počíta) je členstvo aktívne; nemusí bežať žiadny príkaz.
- Naplánované členstvo obsadí miesto hneď pri pridaní, takže ho MaxSeats započíta.
- Začiatok musí byť pred expiráciou, inak TeamsException; pri opätovnom pridaní sa porovná s expiráciou, ktorú si členstvo ponechá. Opätovné pridanie posunie začiatok, len ak zadáte nový startsAt; obnovenie odobratého či expirovaného členstva bez neho začne hneď.
- Pri vypnutej možnosti startsAt vyhodí TeamsException, namiesto toho, aby člen potichu začal hneď — a stĺpec sa nečíta ani nezapisuje, takže aplikácie bez migrácie fungujú ďalej.
- TeamMemberAdded sa spustí pri naplánovaní členstva; pri jeho začiatku sa nespustí žiadna udalosť. Pozvánky a žiadosti o pripojenie dátum začiatku nemajú — člena pridajú hneď.
Predĺženie
// While the membership is active, a new expiresAt extends it in place.
Teams::for($team)->members()->add($contractor, 'editor', expiresAt: now()->addDays(30));
// Re-adding an active member without expiresAt keeps the current expiry.
Teams::for($team)->members()->add($contractor, 'editor');
// Once it has expired, re-adding revives it as a fresh membership: role, meta and
// expiry come from this call (no expiresAt = permanent), and TeamMemberAdded fires.
Teams::for($team)->members()->add($contractor, 'editor', expiresAt: now()->addDays(30));Komu čoskoro vyprší
teams:members:expiring vypíše aktívne členstvá, ktoré vypršia v danom okne, aby ste mohli poslať pripomienku ešte pred stratou prístupu. Predvolene iba číta — MembershipExpiringSoon spustí len s --notify. Už expirované a neobmedzené členstvá vynechá:
php artisan teams:members:expiring # read-only table, window from config
php artisan teams:members:expiring --days=3 # narrow the window
php artisan teams:members:expiring --days=3 --notify # fire MembershipExpiringSoon per memberTo isté zvládnete z vlastného plánovaného jobu — bez Artisanu — alebo sa dopytujte priamo; udalosť potom premeňte na notifikáciu:
use RoundlyConsulting\Teams\Facades\Teams;
use RoundlyConsulting\Teams\Models\Member;
Teams::members()->expiring(days: 7); // Collection<Member> — read-only
Teams::members()->notifyExpiring(days: 7); // fires MembershipExpiringSoon per member
// or query directly:
Member::query()->expiringWithin(7)->get();use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Teams\Events\MembershipExpiringSoon;
Event::listen(function (MembershipExpiringSoon $event): void {
// $event->member->member — whose access lapses
// $event->member->expires_at — when
});Odstránenie expirovaných členstiev
teams:members:prune (alebo Teams::members()->prune()) natrvalo zmaže členstvá, ktorých expirácia uplynula pred viac ako members.prune_after (30 dní), a pre každý riadok spustí MembershipExpired. Member je aj Prunable s rovnakým oknom, takže php artisan model:prune odstráni tie isté riadky tou istou cestou — MembershipExpired sa spustí v oboch prípadoch:
use Illuminate\Support\Facades\Schedule;
// routes/console.php
Schedule::command('teams:members:expiring --notify')->daily(); // renewal reminders
Schedule::command('teams:members:prune')->daily(); // force-delete + MembershipExpired
// or from your own job:
Teams::members()->prune(); // int — the same force-delete + MembershipExpired
// php artisan model:prune collects the same rows and fires MembershipExpired too.Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.