Moderácia viacerými moderátormi
Predvolene jedno volanie Reports::resolve() alebo reject() hlásenie vybaví. Ak má najprv súhlasiť viac moderátorov, otvorte žiadosť o moderáciu: hlásenie sa stane subjektom approvals-for-laravel a o splnení podmienky rozhodne pravidlo enginu. Najprv publikujte migrácie approvals (pozrite Inštalácia).
Moderátori
Moderátori sú uložené Eloquent modely — zvyčajne váš User s traitom GivesApprovals z balíka approvals, ktorý pridá reláciu givenApprovals(). Bez problémov sa kombinuje s GivesReports:
use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\Approvals\Interfaces\GivesApprovalsInterface;
use RoundlyConsulting\Approvals\Traits\GivesApprovals;
use RoundlyConsulting\Reports\Contracts\Reporter;
use RoundlyConsulting\Reports\Traits\GivesReports;
class User extends Model implements GivesApprovalsInterface, Reporter
{
use GivesApprovals;
use GivesReports;
}Otvorenie žiadosti
Otvorte žiadosť o moderáciu a rozhodnutia posielajte cez tie isté resolve() a reject():
use RoundlyConsulting\Approvals\Enums\ApprovalRule;
use RoundlyConsulting\Reports\Facades\Reports;
// Require 2 of the named moderators to agree.
Reports::moderate($report)
->requiring([$alice, $bob, $carol])
->rule(ApprovalRule::Quorum)
->quorum(2)
->open();
Reports::resolve($report, by: $alice); // 1 of 2 — report stays open
Reports::resolve($report, by: $bob, note: 'Spam'); // quorum reached → Resolved- requiring([...]) — moderátori, ktorých súhlas je potrebný. Otvorenie bez nich vyhodí MissingModeratorsException.
- rule(ApprovalRule) — Unanimous, Quorum, Any alebo Weighted; predvolene moderation.default_rule.
- quorum(int) — počet súhlasov pre Quorum alebo prah váhy pre Weighted; predvolene moderation.default_quorum.
- open() — otvorí žiadosť a vráti príslušný ApprovalRequest.
Zoznam moderátorov sa uloží k žiadosti, preto open() odmietne žiadosť, ktorú by nikdy nebolo možné uzavrieť — nič sa neotvorí: pri prázdnom zozname MissingModeratorsException, pri moderátorovi, ktorý ešte nie je uložený, alebo pri kvóre vyššom než počet moderátorov (quorum(4) z troch) InvalidApprovalRequestException z enginu approvals.
Ako sa hlásenie vybaví
Keď je podmienka pravidla splnená, listener SyncReportStatusFromApproval hlásenie automaticky aktualizuje: schválená žiadosť ho vyrieši, zamietnutá zamietne a zrušená či expirovaná ho nechá tak. Na hlásenie sa zapíše rozhodujúci moderátor a jeho poznámka a znova sa spustia ReportResolved, ReportRejected a ReportStatusChanged — vaše listenery tak dostanú rovnaké udalosti bez ohľadu na to, či bolo hlásenie vybavené priamo, alebo cez moderáciu. Pri pravidle Unanimous stačí na zamietnutie hlásenia jediné zamietnutie.
Listener rešpektuje strict_transitions: ak sa hlásenie medzitým presunulo do stavu, z ktorého tabuľka prechod nepovoľuje, neurobí nič.
Rozhodujú len určení moderátori
Kým je žiadosť otvorená ($report->isUnderModeration()), resolve() a reject() prijmú moderátora zo zoznamu requiring([...]) alebo jeho zástupcu v approvals (rozhodnutie sa zapíše za moderátora). Ktokoľvek iný dostane ModeratorRequiredException a nič sa nezaznamená — platí to pre cudziu osobu (jej getPrevious() je UnauthorizedApprovalException z enginu approvals), pre volanie bez aktéra aj pre priamy changeStatus() či close() z otvorených stavov:
use RoundlyConsulting\Reports\Exceptions\ModeratorRequiredException;
use RoundlyConsulting\Reports\Facades\Reports;
try {
Reports::resolve($report, by: $mallory); // not in requiring([...])
} catch (ModeratorRequiredException $e) {
$e->report; $e->actor; // the report, and who was refused (null: no actor)
}review() funguje naďalej. Po rozhodnutí žiadosti sa hlásenie opäť vybavuje priamo.
Sledovanie priebehu
Report používa trait RequiresApproval z balíka approvals, takže priebeh poslednej žiadosti prečítate priamo z hlásenia:
$progress = $report->approvalProgress(); // ?ApprovalProgress — null before a request is opened
$progress?->approved; // approvals so far
$progress?->required; // moderators on the request
$progress?->percentage(); // 0–100
$report->approvalRequests; // every moderation request opened on the reportVážené pravidlá
Pri ApprovalRule::Weighted je kvórum prahom váhy, nie počtom hlasov. Moderátori deklarujú svoju váhu implementáciou rozhrania ProvidesApprovalWeight z balíka approvals — podrobnosti nájdete v dokumentácii Approvals for Laravel.
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.