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\Http\Resources\CommentAuthorResource;
use RoundlyConsulting\Comments\Http\Resources\CommentEditorResource;
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,
    'edit_history' => env('COMMENTS_EDIT_HISTORY', false),
    'deleted_comments' => env('COMMENTS_DELETED_COMMENTS', 'remove'), // 'remove' | 'placeholder'
    'authorization' => env('COMMENTS_AUTHORIZATION', false),

    // The JSON resources CommentResource renders author and editors through — see API resources.
    'resources' => [
        'author' => CommentAuthorResource::class,
        'editor' => CommentEditorResource::class,
    ],

    // 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.
edit_historyfalsePri každej úprave uloží nahradené telo ako číslovanú revíziu s autorom úpravy a časom — pozrite História úprav. Vypnuté: úprava telo prepíše. Vyžaduje migráciu create_comment_revisions_table.
deleted_commentsremoveČo urobí mäkko zmazaný komentár s verejným vláknom: remove (vypadne aj s odpoveďami) alebo placeholder (ponechá si miesto aj odpovede a vykreslí sa bez obsahu); čokoľvek iné vyhodí výnimku.
authorizationfalsePred každou zmenou — create, update, delete, restore, moderate, lock a unlock — sa pýta policy pre Comment.
resources.authorCommentAuthorResource::classJSON resource, cez ktorý CommentResource vykreslí author; dostane model autora (actor). Nastavte ho na vlastný JsonResource, ak chcete pridať meno či avatar — prázdna hodnota alebo null = predvolený; čokoľvek, čo nie je inštanciovateľný potomok JsonResource, vyhodí výnimku.
resources.editorCommentEditorResource::classJSON resource, cez ktorý každý záznam histórie vykreslí autora úpravy; dostane model autora úpravy. Platia rovnaké pravidlá ako pri resources.author.
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_EDIT_HISTORY=true
COMMENTS_DELETED_COMMENTS=placeholder
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).
  • Preklep v deleted_comments vyhodí výnimku, namiesto toho, aby sa potichu použilo remove.
  • resources.author alebo resources.editor, ktorý nie je inštanciovateľný potomok JsonResource — stdClass, neexistujúca trieda, samotná báza JsonResource, abstraktný resource —, vyhodí výnimku pri prvom vykreslení autora či autora úpravy.

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.