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

Vytváranie recenzií

Reviews::for($subject) obmedzí volania na predmet a ->by($author) začne plynulý PendingReview; zreťazte nastavenia a ukončite volaním create():

use RoundlyConsulting\Reviews\Facades\Reviews;

$review = Reviews::for($restaurant)   // the reviewable subject
    ->by($user)                       // the author
    ->rating(5)
    ->title('Loved it')
    ->content('Great place')
    ->meta(['visit' => 'dinner'])     // array or Collection
    ->create();

// Rating-only (no text):
Reviews::for($restaurant)->by($user)->rating(4)->create();

// Text-only (no rating):
Reviews::for($restaurant)->by($user)->content('Friendly staff, slow kitchen')->create();

// Force-approve on create (bypasses moderation):
Reviews::for($restaurant)->by($user)->content('Trusted')->approved()->create();

// Mark a verified purchase / verified reviewer:
Reviews::for($restaurant)->by($user)->rating(5)->verified()->create();

Alebo začnite od predmetu — addReview() ide cez ten istý manažér:

// Start from the subject — for($restaurant)->by($user) is filled in for you:
$restaurant->addReview($user)->rating(5)->content('Best ramen in town')->create();

Prehľad buildera

MetódaÚčel
Reviews::for(Model $reviewable)Hodnotený predmet — vráti ReviewableScope.
->by(Model $author)Autor — vráti PendingReview; predmet aj autor sú odteraz pevne dané.
rating(?int $rating)Hodnotenie v rozsahu min_rating…max_rating; null pre recenziu len s textom.
title(?string $title)Voliteľný nadpis.
content(?string $content)Voliteľný text.
meta(array|Collection|null $meta)Ľubovoľné metadáta, uložené ako JSON.
approved()Schváliť pri vytvorení a obísť moderátora.
verified(bool $verified = true)Označiť overený nákup / recenzenta.
withPhoto() / withPhotos()Pripojiť nahraté súbory (alebo lokálne cesty).
withDraftPhoto(string $token)Naviazať draft upload z media-library.
withPhotoFromDisk($path, $disk)Pripojiť súbor, ktorý už je na disku.
withPhotoFromUrl(string $url)Stiahnuť a pripojiť vzdialený obrázok.
create()Zvalidovať, moderovať, uložiť a vrátiť Review.

Čo robí create()

  • Odmietne prázdnu recenziu — recenzia potrebuje hodnotenie, text alebo oboje.
  • Overí hodnotenie voči rozsahu min_rating…max_rating.
  • Pri zapnutom one_per_author odmietne druhú nezmazanú recenziu od toho istého autora na ten istý predmet — odpovede vlastníka sa nepočítajú. Kontrola prebehne znova pod zámkom riadka autora, takže súbežné odoslania neprejdú obe.
  • Nastaví stav: approved() alebo auto_approve recenziu hneď schváli a nastaví approved_at; inak rozhodne nakonfigurovaný moderátor — autor a predmet sú už priradené — a ako záloha platí default_status.
  • Uloží recenziu a pripojí fotografie v jednej databázovej transakcii — neúspešný upload alebo prekročený limit vráti celé vytvorenie späť.
  • Po transakcii spustí ReviewCreated, takže listenery už vidia uložené fotografie — a potom ReviewApproved alebo ReviewRejected, ak recenzia skončí schválená alebo zamietnutá.

Validácia a výnimky

Všetky výnimky balíka dedia od RoundlyConsulting\Reviews\Exceptions\ReviewException (RuntimeException), jeden catch teda pokryje všetky:

use RoundlyConsulting\Reviews\Exceptions\InvalidRatingException;
use RoundlyConsulting\Reviews\Exceptions\InvalidReviewException;
use RoundlyConsulting\Reviews\Exceptions\ReviewException;

try {
    Reviews::for($restaurant)->by($user)->rating(7)->create();
} catch (InvalidRatingException $e) {
    // "The rating 7 must be between 1 and 5."
} catch (InvalidReviewException $e) {
    // empty review, duplicate author, too many photos, photos disabled
} catch (ReviewException $e) {
    // the common base of every package exception
}
VýnimkaVyhodí sa, keď
InvalidReviewException::empty()Recenzia nemá hodnotenie ani text.
InvalidReviewException::duplicate()Je zapnuté one_per_author a autor už predmet hodnotil.
InvalidReviewException::tooManyPhotos()Fotografie by prekročili photos.max.
InvalidReviewException::photosDisabled()Pripájate fotografiu, hoci photos.enabled je false.
InvalidRatingException::outOfRange()Hodnotenie je mimo min_rating…max_rating — pri vytvorení aj úprave.

Správy o hodnotení, prázdnej recenzii, duplicite a zakázanom slove sú preložiteľné — publikujte reviews-translations a upravte lang/vendor/reviews:

KľúčPredvolená správa
reviews::messages.rating.out_of_rangeThe rating :given must be between :min and :max.
reviews::messages.review.emptyA review must have either a rating or content.
reviews::messages.review.duplicateThis author has already reviewed this subject.
reviews::messages.review.banned_wordThis review contains language that is not allowed.

DTO a akcia

Predmet aj autor sú pevne dané, len čo by() vráti builder, takže ho nemožno presmerovať na iný predmet. create() odovzdá CreateReviewData metóde Reviews::create(), ktorá spustí akciu CreateReview — tá istá operácia jedným volaním:

use RoundlyConsulting\Reviews\DataTransferObjects\CreateReviewData;
use RoundlyConsulting\Reviews\Facades\Reviews;

// The builder's terminal step, in one call:
$review = Reviews::create(new CreateReviewData(author: $user, reviewable: $restaurant, rating: 5));

Alebo spustite akciu sami (pozrite DI a akcie):

use RoundlyConsulting\Reviews\Actions\CreateReview;
use RoundlyConsulting\Reviews\DataTransferObjects\CreateReviewData;

$review = app(CreateReview::class)->execute(new CreateReviewData(
    author: $user,
    reviewable: $restaurant,
    content: 'Great place',
    title: 'Loved it',
    rating: 5,
    meta: collect(['visit' => 'dinner']),
    approved: false,
    verified: true,
));

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.