---
title: "DI, akcie a DTO — Teams for Laravel | Roundly"
description: "Namiesto fasády si injektujte TeamsManager, alebo volajte 17 samostatných akcií s typovanými DTO z vlastných jobov a príkazov."
url: https://roundly-consulting.com/sk/open-source/navody/teams-for-laravel/akcie-a-dto
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Teams for Laravel](https://roundly-consulting.com/sk/open-source/navody/teams-for-laravel.md)

# 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

```php
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

```php
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: 'jane@example.com',
    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í:

```php
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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/teams-for-laravel.md)
