---
title: "Vytváranie recenzií — Reviews for Laravel | Roundly"
description: "Recenzie cez plynulú fasádu — hodnotenie, text, metadáta, vynútené schválenie, overenie — a čo všetko sa validuje."
url: https://roundly-consulting.com/sk/open-source/navody/reviews-for-laravel/vytvaranie-recenzii
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Reviews for Laravel](https://roundly-consulting.com/sk/open-source/navody/reviews-for-laravel.md)

# 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():

```php
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:

```php
// 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. Text len z bielych znakov sa počíta ako žiadny; samotný text sa uloží tak, ako prišiel, nikdy sa neoreže.
- 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 zamykajúcim čítaním pod zámkom riadka autora, takže súbežné odoslania neprejdú obe — ani vo vonkajšej transakcii vašej aplikácie pri predvolenej úrovni REPEATABLE READ v MySQL. Jedno obmedzenie: v PostgreSQL vonkajšia transakcia s úrovňou REPEATABLE READ (nie je predvolená) nevidí recenziu potvrdenú po svojom prvom čítaní, takže ju kontrola môže prehliadnuť.
- 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 transakcii na pripojení modelu recenzie — neúspešný upload alebo prekročený limit vráti celé vytvorenie späť. Ak je pripojenie media-library (pri fotografiách) alebo autora (pri one\_per\_author) iné, dostane vlastnú transakciu okolo nej: jeden commit na pripojenie, nie distribuovaná transakcia.
- 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:

```php
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ýnimka | Vyhodí sa, keď |
| --- | --- |
| `InvalidReviewException::empty()` | Recenzia nemá hodnotenie ani text okrem bielych znakov — pri vytvorení aj po úprave. |
| `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. |

Každá správa výnimky — o hodnotení, prázdnej recenzii, duplicite aj obe chyby fotografií — a dôvod zamietnutia pre zakázané slovo sa zobrazia v aktuálnom jazyku. Balík obsahuje angličtinu a slovenčinu; reviews-translations publikujte a lang/vendor/reviews upravte len vtedy, ak chcete texty preformulovať alebo pridať ďalší jazyk. photos.too\_many má tvary pre množné číslo a vykresľuje sa cez trans\_choice() podľa :max:

| Kľúč | Predvolený anglický text |
| --- | --- |
| `reviews::messages.rating.out_of_range` | The rating :given must be between :min and :max. |
| `reviews::messages.review.empty` | A review must have either a rating or content. |
| `reviews::messages.review.duplicate` | This author has already reviewed this subject. |
| `reviews::messages.review.banned_word` | This review contains language that is not allowed. |
| `reviews::messages.photos.too_many` | {1} A review may have at most :max photo.\|\[0,\*\] A review may have at most :max photos. |
| `reviews::messages.photos.disabled` | Review photos are disabled; enable reviews.photos.enabled to attach photos. |

## 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:

```php
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):

```php
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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

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

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/reviews-for-laravel.md)
