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

DI, akcie a DTO

Fasáda je odporúčaná predvoľba, nie jediná cesta. Balík ponúka tri rovnocenné vstupné body, ktoré spúšťajú ten istý kód:

  • Fasáda Teams — najkratší zápis; používajte ju v bežnom kóde aplikácie.
  • Manager RoundlyConsulting\Teams\TeamsManager — koreň fasády a singleton v kontajneri. Injektujte ho cez konštruktor a dostanete to isté API s explicitnou závislosťou a bez statických volaní.
  • Akcie v RoundlyConsulting\Teams\Actions — final readonly triedy s jednou úlohou a metódou execute(), na skladanie do vlastných akcií, jobov či príkazov.

Injektovanie managera

use RoundlyConsulting\Teams\Models\Invite;
use RoundlyConsulting\Teams\Models\Team;
use RoundlyConsulting\Teams\TeamsManager;

final class InviteController
{
    public function __construct(private TeamsManager $teams) {}

    public function store(Team $team): Invite
    {
        return $this->teams->for($team)->invites()->create(role: 'member');
    }
}

Teams::fake() nahradí aj väzbu TeamsManager v kontajneri, takže manager injektovaný cez konštruktor dostane v testoch fake.

Volanie akcie

use RoundlyConsulting\Teams\Actions\AddMemberAction;
use RoundlyConsulting\Teams\Actions\CreateInviteAction;
use RoundlyConsulting\Teams\DataTransferObjects\AddMemberData;
use RoundlyConsulting\Teams\DataTransferObjects\CreateInviteData;

// The raw actions — the behaviour the manager and facade both run.
$invite = app(CreateInviteAction::class)->execute($team, new CreateInviteData(
    role: 'admin',
    email: '[email protected]',
    invitedBy: $currentUser,
));

app(AddMemberAction::class)->execute($team, new AddMemberData(
    member: $user,
    role: 'admin',
    meta: ['invited_via' => 'import'],
    expiresAt: now()->addYear(),
));

Manager získava každú akciu z kontajnera, takže väzba, ktorú zaregistrujete pre triedu akcie, platí aj pre fasádu. Priame volanie akcie obíde kontroly rozsahu tímu, ktoré robia handly, a Teams::fake() ho nevidí — v kóde aplikácie preto uprednostnite manager. Všetkých 17 akcií je určených pre aplikáciu; žiadna nie je interná.

Metóda fasády → akcia

Metóda fasádyAkciaexecute(…)Udalosti
Teams::create()CreateTeamActionCreateTeamData $data— (vlastníka pridá cez AddMemberAction)
for($t)->members()->add()AddMemberActionTeam $team, AddMemberData $dataTeamMemberAdded / TeamMemberRoleChanged
for($t)->members()->remove()RemoveMemberActionTeam $team, Model $memberTeamMemberDeleted
for($t)->members()->changeRole()ChangeMemberRoleActionTeam $team, Model $member, string $roleTeamMemberRoleChanged
for($t)->transferOwnershipTo()TransferOwnershipActionTeam $team, Model $newOwnerTeamOwnershipTransferred
for($t)->invites()->create()CreateInviteActionTeam $team, CreateInviteData $dataInviteCreated
Teams::invites()->accept()AcceptInviteActionInvite $invite, AcceptInviteData $dataInviteAccepted
for($t)->invites()->resend()ResendInviteActionInvite $inviteInviteResent
for($t)->invites()->revoke()RevokeInviteActionInvite $inviteInviteRevoked
Teams::invites()->prune()PruneInvitesAction——
for($t)->roles()->define()DefineTeamRoleActionDefineTeamRoleData $data—
for($t)->joinRequests()->open()RequestToJoinActionRequestToJoinData $dataJoinRequestCreated (+ JoinRequestApproved)
for($t)->joinRequests()->approve()ApproveJoinRequestActionJoinRequest $request, RespondToJoinRequestData $dataJoinRequestApproved
for($t)->joinRequests()->deny()DenyJoinRequestActionJoinRequest $request, RespondToJoinRequestData $dataJoinRequestDenied
Teams::joinRequests()->expire()ExpireJoinRequestsAction—JoinRequestExpired (pre každý riadok)
Teams::members()->prune()PruneExpiredMembersAction—MembershipExpired (pre každý riadok)
Teams::members()->expiring() / notifyExpiring()DispatchExpiringMembershipsAction?int $withinDays = null, bool $notify = trueMembershipExpiringSoon (pre každý riadok, ak $notify)

DTO

DTO v RoundlyConsulting\Teams\DataTransferObjects sú final readonly triedy. Fasáda a manager ich skladajú z pomenovaných argumentov, takže ich potrebujete len pri priamom volaní akcií:

new CreateTeamData(
    string $name,
    bool $isPublic = false,
    ?Model $owner = null,
    array $meta = [],
);

new AddMemberData(
    Model $member,
    string $role,
    array $meta = [],
    ?CarbonInterface $expiresAt = null,
    ?int $acceptedInviteId = null,   // set internally on invite acceptance
);

new CreateInviteData(
    string $role,
    ?CarbonInterface $expiresAt = null,   // null → invites.expires_after
    ?string $email = null,                // null → an open invite
    ?Model $invitedBy = null,
    array $meta = [],
    ?int $maxUses = 1,                    // null → unlimited seats
);

new AcceptInviteData(
    Model $member,
    ?string $email = null,   // must match an email-targeted invite
);

new DefineTeamRoleData(
    int $teamId,
    string $key,
    string $name,
    array $permissions = [],   // list<string|Permission>
    string $description = '',
);

new RequestToJoinData(
    Team $team,
    Model $requester,
    ?string $requestedRole = null,
    ?string $message = null,
    array $meta = [],
    ?CarbonInterface $expiresAt = null,       // null → never lapses
    array $approvers = [],                    // non-empty → route through approvals-for-laravel
    ?ApprovalRule $approvalRule = null,       // null → teams.approvals.rule
    ?int $approvalQuorum = null,              // null → teams.approvals.quorum
);

new RespondToJoinRequestData(
    Model $responder,
    ?string $role = null,   // overrides the requested/default role on approval
);

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.