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

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
modelComment::classEloquent model, v ktorom sa ukladajú komentáre. Nastavte ho na vlastného potomka pribaleného Comment; iná trieda vyhodí výnimku.
key_typebigintTyp 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_approvalfalseNové komentáre začínajú ako pending a pred zobrazením ich treba schváliť.
max_length5000Max počet znakov tela, najmenej 1; dlhšie vyhodí InvalidCommentBodyException.
max_depth5Max 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.
orderlatestPoradie 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_actionrejectPri zhode, pri zápise aj úprave: reject (vyhodí CommentRejectedException), pending alebo hidden; čokoľvek iné vyhodí výnimku.
mention_resolvernullInvokovateľ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.
authorizationfalsePred každou zmenou — create, update, delete, restore, moderate, lock a unlock — sa pýta policy pre Comment.
moderation.on_resolvedhideSkryje komentár po potvrdení nahlásenia; null (alebo prázdna hodnota) vypne; čokoľvek iné vyhodí výnimku.
moderation.auto_hidetrueSkryje komentár po prekročení globálneho reports.threshold.
media.attachments_bucketattachmentsNázov skupiny, ktorú komentár registruje v Media Library.
media.visibilityprivateprivate (podpísané URL) alebo public; čokoľvek iné vyhodí výnimku — preklep nikdy nevyberie viditeľnosť za vás.
media.disknullDisk 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_disklocalDisk 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_sizenullMax veľkosť prílohy v bajtoch, najmenej 1, vynucovaná pri nahratí (FileUnacceptableForBucket); null = media.max_file_size z Media Library.
media.responsive_widthsnullRebrí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_lifetimenullPlatnosť podpísanej URL prílohy v minútach, najmenej 1; null = predvolená hodnota Media Library.
media.inline.enabledtrueRozbalí 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_missingstripstrip 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-private

Kaž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 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.