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 a súbory, ktoré predchádzajúce fotografie už zapísali (originály aj varianty), sa odstránia.
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 bez ohľadu na photos.enabled, takže fotografie uložené počas zapnutej funkcie svoju recenziu neprežijú. 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=falsePrejavte 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.