NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky

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

ResourcePolia
ThreadResourceid, 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é).
MessageResourceid, 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).
ParticipantResourceid, role, read_at, joined_at, participant (ak je načítaný, cez resources.participant; null, ak model už neexistuje).
MessageParticipantResourcePredvolená 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 none

Prispô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 kryptomien

Odoslaní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.