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

Fotografie k recenziám

Pribalený model Review je vlastníkom médií v Media Library s jednou skupinou photos — responzívnou, zoradenou galériou. Fotografie pripojíte priamo v builderi:

$review = Reviews::for($restaurant)
    ->by($user)
    ->rating(5)
    ->content('Great place')
    ->withPhoto($request->file('photo'))          // one UploadedFile
    ->withPhotos($request->file('photos'))        // an array of files
    ->withDraftPhoto($token)                       // a media-library draft token
    ->withPhotoFromDisk('incoming/a.jpg', 's3')    // a path on a disk
    ->withPhotoFromUrl('https://example.com/a.jpg')
    ->create();

Fotografie sa naviažu v transakcii vytvorenia ešte pred spustením ReviewCreated, takže listenery aj broadcasty ich už vidia. Ak niektorá fotografia zlyhá — alebo ich počet prekročí photos.max — recenzia nevznikne.

Najprv upload, potom recenzia

Draft médiá z Media Library umožnia formuláru nahrať fotografie skôr, než recenzia existuje — upload vráti token a recenzia ho pri odoslaní naviaže:

use RoundlyConsulting\MediaLibrary\Facades\MediaLibrary;

// 1. Upload step — the review does not exist yet. Hand the token back to the client.
$token = MediaLibrary::draft($request->file('photo'))->toBucket('photos')->draft_token;

// 2. Submit step — bind the draft while creating the review.
$review = Reviews::for($restaurant)
    ->by($user)
    ->rating(4)
    ->content('Cosy terrace, friendly staff')
    ->withDraftPhoto($token)
    ->create();

Neznámy alebo už naviazaný token vyhodí DraftMediaNotFound z Media Library; token po expirácii vyhodí DraftMediaExpired.

Čítanie fotografií

$review->photos();                          // Collection<Media> (ordered gallery)
$review->hasPhotos();                       // bool
$review->photoCount();                      // int
$review->firstPhotoUrl();                   // string ('' when empty)
$review->firstPhotoUrl('responsive-320');   // a responsive width variant
$review->photoUrls();                       // list<string>
$review->photoUrls('responsive-640');       // every photo at one width
$review->responsivePhotos(['alt' => 'Guest photo', 'class' => 'photo']); // list<string> of <img srcset="…">
$review->resolvePhotoUrl($media);           // one photo's URL
$review->photoSrcset($media);               // one photo's srcset
$review->firstPhotoTemporaryUrl();          // always a signed URL
$review->photosBucket();                    // 'photos' (reviews.photos.bucket)

Skupina vygeneruje jeden responzívny variant pre každú šírku z photos.responsive_widths s názvom responsive-<šírka> (predvolene responsive-320, responsive-640, responsive-1024). Media Library nikdy nezväčšuje, šírka väčšia než originál sa preto nevygeneruje. Kým variant nie je vygenerovaný — alebo ak je fotografia užšia než daná šírka — čítacie metódy vrátia originál. Názov, ktorý skupina nedeklaruje (napr. 'thumb'), vyhodí InvalidVariant z Media Library.

Pravidlá skupiny

  • Viditeľnosť — predvolene verejná; galérie len cez podpísané URL nájdete v časti Súkromné fotografie.
  • Povolené typy — photos.accepted_mime_types (predvolene JPEG, PNG, WebP a GIF).
  • Veľkosť súboru — photos.max_file_size, predvolene 5 MB (0 = bez limitu na fotografiu).
  • Počet — photos.max na recenziu, predvolene 5 (0 = bez limitu); prekročenie vyhodí InvalidReviewException::tooManyPhotos().

Počty fotografií v súhrne

$summary = $restaurant->ratingSummary();

$summary->photoCount;          // photos across approved reviews
$summary->reviewsWithPhotos;   // approved reviews carrying at least one photo

Reviews::for($restaurant)->photoCount();
Reviews::for($restaurant)->reviewsWithPhotos();

Životný cyklus

  • Predgenerovanie po schválení — keď sa recenzia stane schválenou, listener na ReviewApproved zaradí do fronty pre každú fotografiu jeden job na generovanie variantov, takže náhľady sú pripravené v momente zverejnenia. Platí to bez ohľadu na cestu — approve(), schválenie pri vytvorení (approved(), auto_approve alebo moderátor) či opätovné moderovanie po úprave. Vypnete ho cez photos.warm_on_approval.
  • Upratanie — trvalé zmazanie recenzie vyprázdni jej skupinu photos. Mäkko zmazaná (a neskôr obnovená) recenzia si fotografie ponechá.

Vypnutie fotografií

Po vypnutí funkcie sa skupina vôbec nedeklaruje, čítacie metódy vracajú prázdne hodnoty a každé volanie withPhoto*() vyhodí InvalidReviewException::photosDisabled():

REVIEWS_PHOTOS_ENABLED=false

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.