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ády | Akcia | execute(…) | Udalosti |
|---|---|---|---|
Teams::create() | CreateTeamAction | CreateTeamData $data | — (vlastníka pridá cez AddMemberAction) |
for($t)->members()->add() | AddMemberAction | Team $team, AddMemberData $data | TeamMemberAdded / TeamMemberRoleChanged |
for($t)->members()->remove() | RemoveMemberAction | Team $team, Model $member | TeamMemberDeleted |
for($t)->members()->changeRole() | ChangeMemberRoleAction | Team $team, Model $member, string $role | TeamMemberRoleChanged |
for($t)->transferOwnershipTo() | TransferOwnershipAction | Team $team, Model $newOwner | TeamOwnershipTransferred |
for($t)->invites()->create() | CreateInviteAction | Team $team, CreateInviteData $data | InviteCreated |
Teams::invites()->accept() | AcceptInviteAction | Invite $invite, AcceptInviteData $data | InviteAccepted |
for($t)->invites()->resend() | ResendInviteAction | Invite $invite | InviteResent |
for($t)->invites()->revoke() | RevokeInviteAction | Invite $invite | InviteRevoked |
Teams::invites()->prune() | PruneInvitesAction | — | — |
for($t)->roles()->define() | DefineTeamRoleAction | DefineTeamRoleData $data | — |
for($t)->joinRequests()->open() | RequestToJoinAction | RequestToJoinData $data | JoinRequestCreated (+ JoinRequestApproved) |
for($t)->joinRequests()->approve() | ApproveJoinRequestAction | JoinRequest $request, RespondToJoinRequestData $data | JoinRequestApproved |
for($t)->joinRequests()->deny() | DenyJoinRequestAction | JoinRequest $request, RespondToJoinRequestData $data | JoinRequestDenied |
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 = true | MembershipExpiringSoon (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 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.