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=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.