Konfigurácia
Balík funguje bez akejkoľvek konfigurácie — každý kľúč má rozumnú predvolenú hodnotu. Publikovaný config/comments.php bez docblockov:
use RoundlyConsulting\Comments\Models\Comment;
return [
'model' => Comment::class,
'key_type' => env('COMMENTS_KEY_TYPE', 'bigint'),
'require_approval' => env('COMMENTS_REQUIRE_APPROVAL', false),
'max_length' => env('COMMENTS_MAX_LENGTH', 5000),
'max_depth' => env('COMMENTS_MAX_DEPTH', 5),
'order' => env('COMMENTS_ORDER', 'latest'),
'blocklist' => [],
'blocklist_action' => env('COMMENTS_BLOCKLIST_ACTION', 'reject'),
'mention_resolver' => null,
'authorization' => env('COMMENTS_AUTHORIZATION', false),
// Auto-hide a comment on an upheld report / threshold crossing (reports-for-laravel).
'moderation' => [
'on_resolved' => 'hide', // 'hide' | null — anything else throws
'auto_hide' => true, // react to the global reports threshold
],
// Attachments + inline [media:UUID] rendering (media-library-for-laravel).
'media' => [
'attachments_bucket' => 'attachments',
'visibility' => env('COMMENTS_MEDIA_VISIBILITY', 'private'),
'disk' => env('COMMENTS_MEDIA_DISK'),
'private_disk' => env('COMMENTS_MEDIA_PRIVATE_DISK', 'local'),
'accepted_mime_types' => [],
'max_file_size' => null,
'responsive_widths' => null,
'temporary_url_lifetime' => null,
'inline' => [
'enabled' => true,
'default_variant' => '',
'on_missing' => 'strip', // 'strip' | 'keep' (anything else throws)
],
],
];Všetky kľúče
| Kľúč | Predvolené | Účel |
|---|---|---|
model | Comment::class | Eloquent model, v ktorom sa ukladajú komentáre. Nastavte ho na vlastného potomka pribaleného Comment; iná trieda vyhodí výnimku. |
key_type | bigint | Typ kľúča polymorfných stĺpcov: bigint, uuid alebo ulid — čokoľvek iné vyhodí výnimku. Načíta sa pri spustení migrácie; kľúče sa ukladajú a čítajú bez zmeny. |
require_approval | false | Nové komentáre začínajú ako pending a pred zobrazením ich treba schváliť. |
max_length | 5000 | Max počet znakov tela, najmenej 1; dlhšie vyhodí InvalidCommentBodyException. |
max_depth | 5 | Max vnorenie odpovedí, najmenej 1 (komentár najvyššej úrovne má hĺbku 1; mäkko zmazaní predkovia sa započítavajú); obmedzuje aj eager loading vlákien. |
order | latest | Poradie approvedComments: latest (najnovšie prvé) alebo oldest; čokoľvek iné vyhodí výnimku. |
blocklist | [] | Zakázané slová (celé slová, bez ohľadu na veľkosť písmen) alebo regulárne výrazy s oddeľovačmi, napr. /badword/i. Prázdna položka alebo položka, ktorá nie je reťazec, vyhodí výnimku. |
blocklist_action | reject | Pri zhode, pri zápise aj úprave: reject (vyhodí CommentRejectedException), pending alebo hidden; čokoľvek iné vyhodí výnimku. |
mention_resolver | null | Invokovateľná trieda (class-string) alebo dvojica [Class::class, 'method'] vytvorená cez kontajner, ktorá priradí @handle k modelu — nikdy nie closure (config:cache ju neuloží). null = handles sa len uložia; hodnota, z ktorej nevznikne volateľný resolver — neznáma trieda, chýbajúca metóda —, vyhodí výnimku. |
authorization | false | Pred každou zmenou — create, update, delete, restore, moderate, lock a unlock — sa pýta policy pre Comment. |
moderation.on_resolved | hide | Skryje komentár po potvrdení nahlásenia; null (alebo prázdna hodnota) vypne; čokoľvek iné vyhodí výnimku. |
moderation.auto_hide | true | Skryje komentár po prekročení globálneho reports.threshold. |
media.attachments_bucket | attachments | Názov skupiny, ktorú komentár registruje v Media Library. |
media.visibility | private | private (podpísané URL) alebo public; čokoľvek iné vyhodí výnimku — preklep nikdy nevyberie viditeľnosť za vás. |
media.disk | null | Disk pre všetky prílohy; null alebo prázdna hodnota = podľa viditeľnosti (súkromné → media.private_disk, verejné → predvolený disk Media Library). |
media.private_disk | local | Disk pre súkromné prílohy a ich varianty, keď media.disk nie je nastavený — musí byť neverejný (COMMENTS_MEDIA_PRIVATE_DISK). |
media.accepted_mime_types | [] | Allowlist mime typov; [] prijme akýkoľvek typ. |
media.max_file_size | null | Max veľkosť prílohy v bajtoch, najmenej 1, vynucovaná pri nahratí (FileUnacceptableForBucket); null = media.max_file_size z Media Library. |
media.responsive_widths | null | Rebrík šírok pre obrázkové prílohy — zoznam kladných celých čísel (varianty s názvom responsive-<šírka>); null = media.responsive.widths z Media Library. |
media.temporary_url_lifetime | null | Platnosť podpísanej URL prílohy v minútach, najmenej 1; null = predvolená hodnota Media Library. |
media.inline.enabled | true | Rozbalí tokeny [media:UUID] v renderBody(). |
media.inline.default_variant | '' (prázdne) | Variant pre token bez variantu — reťazec; prázdne = responzívny <img>. |
media.inline.on_missing | strip | strip alebo keep pre tokeny, ktoré sa nenašli; čokoľvek iné vyhodí výnimku. |
Prostredie (env)
Bežné prepínače sa riadia cez env, takže súbor väčšinou publikovať nemusíte:
COMMENTS_KEY_TYPE=bigint
COMMENTS_REQUIRE_APPROVAL=true
COMMENTS_MAX_LENGTH=2000
COMMENTS_MAX_DEPTH=3
COMMENTS_ORDER=oldest
COMMENTS_BLOCKLIST_ACTION=pending
COMMENTS_AUTHORIZATION=true
COMMENTS_MEDIA_VISIBILITY=private
COMMENTS_MEDIA_PRIVATE_DISK=s3-privateKaždý prepínač typu bool sa načíta ako boolean, takže hodnoty v .env znamenajú presne to, čo hovoria: true, 1, on a yes ho zapnú; false, 0, off a no ho vypnú. COMMENTS_REQUIRE_APPROVAL=1 nové komentáre podrží na kontrolu, COMMENTS_AUTHORIZATION=off policy preskočí. Prázdna hodnota (COMMENTS_AUTHORIZATION=) sa považuje za nenastavenú, takže platí predvolená. Čokoľvek iné vyhodí InvalidConfigurationException, namiesto toho, aby sa potichu použila predvolená hodnota.
Striktné nastavenia
Rovnako striktné sú aj všetky ostatné nastavenia a každá chyba vyhodí RoundlyConsulting\PackageToolkit\Exceptions\InvalidConfigurationException s názvom kľúča. Nastavenie bez hodnoty — kľúč chýba, je null alebo je prázdny ako riadok COMMENTS_MAX_LENGTH= v hostiteľskej aplikácii —, použije svoju predvolenú hodnotu; voliteľné nastavenie (media.disk, media.max_file_size, media.responsive_widths, media.temporary_url_lifetime) zostane nenastavené:
- Celé čísla prijímajú int alebo reťazec s celým číslom — každá hodnota z env je reťazec —, takže COMMENTS_MAX_LENGTH=five či 5.5 vyhodí výnimku, namiesto toho, aby sa z nej stala 0. Dĺžky, hĺbky, veľkosti, šírky a doby platnosti musia byť najmenej 1.
- Preklep v order, blocklist_action, moderation.on_resolved, media.visibility alebo media.inline.on_missing vyhodí výnimku, namiesto toho, aby sa zvolila jedna z možností — preklep v media.visibility sa už nečíta ako private a preklep v on_resolved už nevypne automatické skrývanie.
- Názov skupiny či disku, ktorý nie je reťazec, vyhodí výnimku, rovnako ako chybný zoznam (blocklist, accepted_mime_types, responsive_widths).
php artisan about chybné nastavenie zobrazí ako INVALID, namiesto toho, aby zlyhal.
Typ kľúča
key_type určuje typ kľúča polymorfných stĺpcov actor, commentable, mentionable a lockable: bigint (predvolene), uuid alebo ulid — prázdna hodnota (COMMENTS_KEY_TYPE=) sa považuje za nenastavenú a ponechá bigint, iná hodnota vyhodí InvalidConfigurationException. Načíta sa pri spustení migrácie, preto ho nastavte ešte pred migrovaním.
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 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.