JSON resource
ReviewResource (a ReviewCollection) poskytujú rozumný verejný tvar pre API a mobilných klientov:
use RoundlyConsulting\Reviews\Http\Resources\ReviewResource;
return ReviewResource::collection(
$product->approvedReviews()->with(['author', 'reviewable', 'responses'])->get(),
);| Pole | Hodnota |
|---|---|
id / parent_id | Kľúč recenzie; kľúč rodiča pri odpovediach vlastníka. |
rating / status / verified | Hodnotenie (alebo null), stav ako reťazec, príznak overenia. |
title / content | Text recenzie. |
helpful_count / unhelpful_count / helpful_score | Počty hlasov a ich rozdiel. |
author / reviewable | Každé ako { id, type } — type je krátky názov triedy modelu (User), nikdy celý názov triedy; null, keď súvisiaci riadok už neexistuje. |
responses | Vnorené položky ReviewResource — len ak je vzťah načítaný. |
photos | Zoznam { id, url, srcset }, pri súkromných fotografiách podpísaný. |
created_at / updated_at / approved_at | Reťazce vo formáte ISO 8601. |
meta sa zámerne nezverejňuje, interné poznámky a dôvody zamietnutia teda ostanú súkromné. URL fotografií sa riadia ich viditeľnosťou — pri súkromných sú podpísané, nikdy verejné.
Autor a predmet
author ani reviewable nikdy neobsahujú názov PHP triedy. Každé sa vykreslí cez vlastný resource, ktorý obalí súvisiaci model — ReviewAuthorResource a ReviewableResource, predvolene oba {id, type}. type je krátky názov triedy modelu (User, Product), s morph mapou aj bez nej — nikdy nie morph alias ani celý názov triedy (App\Models\User):
{
"id": 12,
"rating": 5,
"author": { "id": 7, "type": "User" },
"reviewable": { "id": 42, "type": "Product" },
…
}Ak súvisiaci riadok už neexistuje, vykreslí sa null; oba kľúče sú vždy prítomné. Ak vaše API potrebuje viac (meno, avatar, nadpis), nasmerujte reviews.resources.author alebo reviews.resources.reviewable na vlastný JsonResource. Dostane súvisiaci model:
// app/Http/Resources/ReviewerResource.php
final class ReviewerResource extends JsonResource
{
public function toArray(Request $request): array
{
return [
'id' => $this->resource->getKey(),
'name' => $this->resource->name,
'avatar' => $this->resource->avatar_url,
];
}
}
// config/reviews.php
'resources' => [
'author' => App\Http\Resources\ReviewerResource::class,
'reviewable' => RoundlyConsulting\Reviews\Http\Resources\ReviewableResource::class,
],Prázdna hodnota použije resource balíka; čokoľvek, čo nie je konkrétnou podtriedou JsonResource, vyhodí InvalidConfigurationException s názvom kľúča. ReviewResource::authorOf($review, $request) a ReviewResource::reviewableOf($review, $request) vrátia tie isté vykreslené odkazy ako obyčajné polia (alebo null).
Stránkované kolekcie
use RoundlyConsulting\Reviews\Http\Resources\ReviewCollection;
return new ReviewCollection(
$product->approvedReviews()->latestFirst()->paginate(10),
);ReviewCollection pred vykreslením načíta autorov a predmety svojich recenzií — aj už načítaných odpovedí vlastníka — jedným dopytom na každý morph typ; samotné odpovede nikdy nenačítava. Keď recenzie vykresľujete inak (new ReviewResource($review), ReviewResource::collection()), načítajte author a reviewable vopred ako v príklade vyššie, inak pribudne dopyt na každú recenziu.
Úpravy
Publikujte upraviteľné kópie — App\Http\Resources\Reviews\ReviewResource a ReviewCollection v app/Http/Resources/Reviews, triedy vo vašom namespace, ktoré vlastníte a ktoré na začiatku vykresľujú presne to isté ako resource balíka:
# Translations → lang/vendor/reviews
php artisan vendor:publish --tag="reviews-translations"
# JSON resources → app/Http/Resources/Reviews
php artisan vendor:publish --tag="reviews-resources"Upravte ich a v controlleroch používajte ich namiesto tried balíka:
use App\Http\Resources\Reviews\ReviewResource;
return ReviewResource::collection(
$product->approvedReviews()->with(['author', 'reviewable', 'responses'])->get(),
);Publikovaný ReviewResource vykresľuje author a reviewable cez pomocné metódy balíka, takže náhrady cez reviews.resources.* platia aj pre vašu kópiu:
// app/Http/Resources/Reviews/ReviewResource.php
use RoundlyConsulting\Reviews\Http\Resources\ReviewResource as PackageReviewResource;
'author' => PackageReviewResource::authorOf($review, $request),
'reviewable' => PackageReviewResource::reviewableOf($review, $request),Kópie publikované pred verziou 1.2.0 stále vykresľujú uložené author_type a reviewable_type — v aplikácii bez morph mapy celý názov triedy. Publikujte resources znova (--force prepíše vaše úpravy) alebo tieto dva kľúče vo svojej kópii nahraďte riadkami vyššie.
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.