Rozšírenie
Stavy, priority, pravidlá oprávnení, notifikácie, pravidlá priraďovania a termínov — dokonca aj modely — vymeníte bez forku. Kontrakty viazané cez konfiguráciu sa dajú naviazať aj priamo v kontajneri:
| Kontrakt | Metódy | Predvolené / väzba z |
|---|---|---|
TicketState | category(): StatusCategory | Enums\TicketStatus |
TicketLifecycle | automation(Automation $hook): ?string | Lifecycle\TicketLifecycle (tickets.lifecycle) |
Priority | weight(): int | Enums\TicketPriority (tickets.priority.enum) |
Assignee | ticketAssigneeName(), ticketNotifiables(): iterable, isEligibleTicketAssignee(Ticket) | predvolené z Concerns\IsTicketAssignee |
TicketProject | ticketReferencePrefix(): string | váš model projektu |
AssignmentStrategy | assigneeFor(Ticket): ?Model | Assignment\CategoryDefaultStrategy (tickets.assignment.strategy) |
DueDateResolver | dueAt(Ticket): ?CarbonImmutable | Due\CategoryDueDateResolver (tickets.due.resolver) |
GuestLinkGenerator | for(Ticket, Model $recipient): string | Guests\SignedRouteLinkGenerator (tickets.guests.link_generator) |
AgentScope | allows(Model $agent, Ticket), constrain(Builder, Model $agent) | Authorization\UnrestrictedAgentScope (tickets.authorization.agent_scope) |
ConversationLock | lock, unlock, isLocked | Conversation\CommentsConversationLock |
TicketEvent | ticket(): Ticket, actor(): ?Model | implementuje ho každá udalosť tiketu (pozrite Udalosti) |
Pri založení každý kontrakt vidí uložený tiket: riešiteľ (kontrola vhodnosti cez isEligibleTicketAssignee() → AgentScope::allows(), alebo AssignmentStrategy::assigneeFor()) aj termín (DueDateResolver::dueAt()) sa vyberú hneď po vložení riadku, v tej istej transakcii — s kľúčom, číslom tiketu, poradovým číslom, počiatočným stavom, žiadateľom, projektom, kategóriou (načítanou), prioritou a kanálom, ešte však bez hodnôt vlastných polí, štítkov, sledujúcich, príloh, riešiteľa a termínu. allows(), ktoré sa pýta databázy podľa kľúča, funguje.
Dodané implementácie
| Trieda | Implementuje | Správanie |
|---|---|---|
Assignment\CategoryDefaultStrategy | AssignmentStrategy | default_assignee kategórie tiketu alebo jej najbližšieho predka, ktorý ho nastavuje. |
Due\CategoryDueDateResolver | DueDateResolver | Teraz plus default_due_in kategórie tiketu alebo jej najbližšieho predka, ktorý ho nastavuje. |
Guests\SignedRouteLinkGenerator | GuestLinkGenerator | Dočasná podpísaná URL routy tickets.guest.show; potrebuje routy pre hostí, inak InvalidTicketsConfigurationException. |
Authorization\UnrestrictedAgentScope | AgentScope | Každý agent pracuje na každom tikete. |
Conversation\CommentsConversationLock | ConversationLock | Comments::lock() / unlock() na vlákne tiketu, idempotentné oboma smermi (naviazané cez $app->bind(), na nahradenie ho naviažte znova). |
Lifecycle\TicketLifecycle | TicketLifecycle | Dodaný životný cyklus (pozrite Stavy a prechody). |
Policies\TicketPolicy | — | Policy API (pozrite Policy a rozsah agentov). |
Tam, kde má podtrieda zmysel, nie sú final (TicketLifecycle, TicketPolicy, triedy notifikácií); inak kontrakt implementujte sami.
Ďalšie miesta na výmenu
- Životný cyklus — tickets.lifecycle (pozrite Stavy a prechody).
- Škála priorít — tickets.priority.enum (pozrite Kategórie a priority).
- Modely — tickets.models.* s podtriedami modelov z balíka (pozrite Modely, kľúče a čísla tiketov).
- Policy — tickets.authorization.policy s podtriedou TicketPolicy (pozrite Policy a rozsah agentov).
- Každá notifikácia — tickets.notifications.types.<type> s podtriedou, alebo false na vypnutie (pozrite Notifikácie).
- Akcie — naviažte vlastnú implementáciu v kontajneri; každá cesta cez fasádu si akcie berie z neho.
Verejné pomocné triedy
| Trieda | Metódy | Použitie |
|---|---|---|
Support\TicketModels | ticket(), category(), field(), tag(), guest() | Miesto pre modely — nakonfigurovaná trieda z tickets.models.*. V kóde, ktorý musí nasledovať výmenu modelu, sa pýtajte cez ňu (TicketModels::ticket()::query()). |
Support\Optional | new Optional, static given(mixed $value): bool | Značka nezadanej hodnoty v DTO Update*Data, aby null mohlo znamenať zrušenie. |
Support\TicketsConfig | lifecycle(), priorityEnum(), referencePrefix(), channels(), autoCloseAfter(), notificationUrl($reference), routesEnabled(), … | Prečíta nastavenie tickets.* presne ako balík — nezmyselná hodnota vyhodí výnimku s názvom kľúča. |
Fields\FieldSetResolver | forTicket(Ticket), forScope(…), attributeDefinitions(Ticket), knownKeys(Ticket), flush() | Platná sada polí, zapamätaná pre (projekt, kategória); scoped väzba (na požiadavku / job, bezpečná pre Octane) — získajte ju z kontajnera, nikdy ju nevytvárajte cez new. |
Notifications\RecipientResolver | created(), assigned(), replied(), noteAdded(), mentioned(), statusChanged(), due(), merged(), replyType(AuthorRole) | Komu ktorá notifikácia ide, už s kontrolou viditeľnosti, bez duplicít a prefiltrované — použite ho na rozposlanie zmeny tiketu vlastným kanálom. |
Všetko ostatné pod Support\, Http\, Listeners\ a Actions\Internal\ je interné.
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.