API resources
Pre stavbu API na správy alebo Inertia/SPA backendu sú pripravené JSON resources. Vystavujú len bezpečné polia, zobrazujú stav prečítania a údaje o odpovedi a korektne sa správajú, aj keď vzťahy nie sú prednačítané:
use RoundlyConsulting\Messages\Facades\Messages;
use RoundlyConsulting\Messages\Http\Resources\MessageResource;
use RoundlyConsulting\Messages\Http\Resources\ParticipantResource;
use RoundlyConsulting\Messages\Http\Resources\ThreadResource;
return ThreadResource::collection(Messages::inboxFor($request->user()));
return MessageResource::collection(Messages::thread($thread)->messages());Polia
| Resource | Polia |
|---|---|
ThreadResource | id, name, is_direct, is_public, is_archived, last_activity_at, unread_count (ak je k dispozícii, napr. zo schránky), latest_message a participants (ak sú načítané). |
MessageResource | id, thread_id, type, body (po zrušení odoslania null), preview, is_deleted, sender (ak je načítaný, cez resources.participant; pri systémovej správe či zmazanom odosielateľovi null), reply_to (id, excerpt, sender_id, sender_type; excerpt je snímka preview() rodičovskej správy, sender_type názov triedy citovaného odosielateľa bez menného priestoru), sent_at, edited_at (len textové správy, z meta.edited_at — null, ak sa text naozaj neupravil). |
ParticipantResource | id, role, read_at, joined_at, participant (ak je načítaný, cez resources.participant; null, ak model už neexistuje). |
MessageParticipantResource | Predvolená hodnota resources.participant: participateAs() modelu, ak implementuje ParticipatesInMessaging, inak id + type, kde type je názov triedy bez menného priestoru (User, nikdy App\Models\User). |
ThreadResource spojte s Messages::inboxFor() — schránka už prednačíta všetko, čo resource číta, vrátane unread_count. Oba stránkovače sa riadia parametrom ?page= z požiadavky, takže meta.current_page aj links.next v obálke zostávajú zosúladené pre klienta s nekonečným posúvaním.
Žiadny resource neobsahuje názov PHP triedy. MessageResource sa vykreslí takto:
{
"id": 7, "thread_id": 1, "type": "text", "body": "On it", "preview": "On it", "is_deleted": false,
"sender": {"id": 4, "name": "Bob"},
"reply_to": {"id": 6, "excerpt": "First", "sender_id": 3, "sender_type": "User"},
"sent_at": "2026-10-18T09:30:00+00:00",
"edited_at": null
}Účastníci a odosielatelia
participant a sender sa vykresľujú cez triedu v resources.participant, predvolene MessageParticipantResource: ak model implementuje ParticipatesInMessaging, je to jeho participateAs() ({"id": 4, "name": "Bob"} vyššie), inak jeho kľúč a názov triedy bez menného priestoru — {"id": 12, "type": "Restaurant"}, nikdy App\Models\Restaurant. Ak vaše API potrebuje viac, nasmerujte kľúč na vlastný JsonResource — dostane model účastníka:
// config/messages.php
'resources' => [
'participant' => App\Http\Resources\ChatMemberResource::class,
],
// app/Http/Resources/ChatMemberResource.php
final class ChatMemberResource extends JsonResource
{
public function toArray(Request $request): array
{
return [
'id' => $this->resource->getKey(),
'type' => class_basename($this->resource),
'name' => $this->resource->name,
'avatar_url' => $this->resource->avatar_url,
];
}
}MessageParticipantResource::configured() zostaví nakonfigurovaný resource okolo modelu, alebo vráti null, ak model chýba. Cez túto metódu vykresľujú resources balíka aj publikované kópie, takže jedna výmena platí pre oboje:
use RoundlyConsulting\Messages\Http\Resources\MessageParticipantResource;
MessageParticipantResource::configured($message->sender)?->resolve($request); // null for nonePrispôsobenie
Publikujte upraviteľné kópie — ThreadResource, MessageResource a ParticipantResource v App\Http\Resources\Messages (app/Http/Resources/Messages):
php artisan vendor:publish --tag="messages-resources"Kým ich neupravíte, vykresľujú presne to isté ako resources balíka; vo svojich controlleroch ich používajte namiesto tried balíka. ThreadResource vykresľuje poslednú správu aj účastníkov tiež cez vaše kópie. Kópia MessageResource publikovaná pred verziou 1.1.0 stále číta edited_at z updated_at, takže zrušená či obnovená správa sa v nej javí ako upravená — prekopírujte si do nej editedAt() z MessageResource balíka.
Kópie publikované verziou 1.1.x alebo staršou vracajú pôvodný výstup: morph typ — v aplikácii bez morph mapy celý názov triedy — v participant.type (pri modeli bez ParticipatesInMessaging) aj v reply_to.sender_type a null pre takéhoto odosielateľa. Publikujte ich znova s --force, čo prepíše vaše úpravy, alebo si do nich prekopírujte kód pre participant, sender a senderType() z resources balíka.
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.