NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Teams for Laravel

Č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 days

Po 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 member

To 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 kryptomien

Odoslaní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.