---
title: "DI, akcie a DTO — Reports for Laravel | Roundly"
description: "Namiesto fasády si vložte ReportsManager alebo spustite jednu zo šiestich tried akcií s readonly DTO z jobov a služieb."
url: https://roundly-consulting.com/sk/open-source/navody/reports-for-laravel/akcie-a-dto
language: sk
---

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

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

# DI, akcie a DTO

Fasáda je odporúčaná predvoľba, nie jediná cesta. Ten istý kód spúšťajú tri vstupné body:

- Fasáda Reports — najkratší zápis.
- Manažér vložený cez konštruktor — rovnaké API s explicitnou závislosťou a bez statických volaní. RoundlyConsulting\\Reports\\ReportsManager je koreň fasády, zámerne nie final, aby ho fake mohol rozšíriť.
- Akcie — jednoúčelové triedy s metódou execute(), dostupné z kontajnera, ktoré zapojíte do vlastných jobov, služieb a príkazov.

## Vloženie manažéra

Reports::fake() nahradí manažér aj v kontajneri, takže vložené manažéry skončia na fake:

```php
use RoundlyConsulting\Reports\ReportsManager;

final class ReportPost
{
    public function __construct(private ReportsManager $reports) {}

    public function __invoke(User $user, Post $post): Report
    {
        return $this->reports->report($post)->by($user)->for('spam')->create();
    }
}

// The whole facade API is on the manager:
$this->reports->review($report);
```

## Spustenie akcie

```php
use RoundlyConsulting\Approvals\Enums\ApprovalRule;
use RoundlyConsulting\Reports\Actions\ChangeReportStatusAction;
use RoundlyConsulting\Reports\Actions\CreateReportAction;
use RoundlyConsulting\Reports\Actions\OpenModerationAction;
use RoundlyConsulting\Reports\Actions\PruneReportsAction;
use RoundlyConsulting\Reports\Actions\RejectReportAction;
use RoundlyConsulting\Reports\Actions\ResolveReportAction;
use RoundlyConsulting\Reports\DataTransferObjects\CreateReportData;
use RoundlyConsulting\Reports\DataTransferObjects\ResolveReportData;
use RoundlyConsulting\Reports\Enums\Reason;
use RoundlyConsulting\Reports\Enums\Status;

$report = app(CreateReportAction::class)->execute(new CreateReportData(
    subject: $post,
    reason: Reason::Spam,        // Reason|string, normalised to a slug
    reporter: $user,             // optional
    description: 'Looks like spam.',
    guestIdentifier: null,       // optional dedupe key for anonymous reports
));

app(ChangeReportStatusAction::class)->execute($report, Status::InReview);

app(ResolveReportAction::class)
    ->execute($report, new ResolveReportData(resolver: $moderator, note: 'Handled.'));

// or

app(RejectReportAction::class)
    ->execute($report, new ResolveReportData(resolver: $moderator, note: 'No violation.'));

app(OpenModerationAction::class)->execute($report, [$alice, $bob], ApprovalRule::Quorum, 1); // ApprovalRequest

app(PruneReportsAction::class)->execute(days: 90, force: false); // int
```

## Metóda fasády → akcia

| Metóda fasády / manažéra | Akcia |
| --- | --- |
| `report($subject) / from($reporter)` | `CreateReportAction (via ->create())` |
| `create(CreateReportData $data)` | `CreateReportAction` |
| `moderate($report)` | `OpenModerationAction (via ->open())` |
| `resolve($report, ?$by, ?$note)` | `ResolveReportAction` |
| `reject($report, ?$by, ?$note)` | `RejectReportAction` |
| `changeStatus($report, Status $status)` | `ChangeReportStatusAction` |
| `review($report) / close($report)` | `ChangeReportStatusAction` |
| `prune(?int $days = null, bool $force = false)` | `PruneReportsAction` |

- CreateReportAction — odmietne neuložený subjekt či nahlasovateľa výnimkou LogicException, overí dôvod, uplatní ochranu pred duplicitami (hlásenia na jeden subjekt sa spracúvajú postupne), uloží hlásenie v stave Pending a skontroluje prah.
- ResolveReportAction / RejectReportAction — vybavia hlásenie v jednom uzamknutom kroku overenom voči uloženému stavu; kým je otvorená žiadosť o moderáciu, zaznamenajú namiesto toho rozhodnutie určeného moderátora a ostatných odmietnu výnimkou ModeratorRequiredException.
- ChangeReportStatusAction — zodpovedá za každý presun stavu: pri rovnakom stave nič, pri strict\_transitions InvalidStatusTransitionException, pri presune z otvorených stavov počas otvorenej moderácie ModeratorRequiredException, inak zmena a ReportStatusChanged.
- OpenModerationAction — bez moderátorov vyhodí MissingModeratorsException a pod zámkom riadka hlásenia ModerationNotAllowedException pri vybavenom hlásení alebo hlásení, ktoré už je pod moderáciou; inak otvorí žiadosť v approvals.
- PruneReportsAction — mäkko, alebo s force natrvalo, zmaže hlásenia v stave Resolved, Rejected a Closed vytvorené pred hranicou.

Čítanie dôvodov za sebou žiadnu akciu nemá. ReportsManager::openModeration() — koncový krok moderate()->open() — je @internal. Priame volanie akcie manažér obíde, preto ho Reports::fake() nezaznamená.

## DTO

```php
final readonly class CreateReportData
{
    public string $reason; // normalised from Reason|string

    public function __construct(
        public Model $subject,
        Reason|string $reason,
        public ?Model $reporter = null,
        public ?string $description = null,
        public ?string $guestIdentifier = null,
    ) {}
}

final readonly class ResolveReportData
{
    public function __construct(
        public ?Model $resolver = null,
        public ?string $note = null,
    ) {}
}
```

CreateReportData prevedie prípad Reason na jeho slug, takže $data->reason je vždy reťazec.

## 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/reports-for-laravel.md)
