Telá komentárov sa pri zápise aj úprave prehľadávajú na tokeny @handle. Handles sa vždy uložia ako záznamy CommentMention; nastavte resolver, ktorý ich priradí k modelom a odošle CommentMentioned. Resolver je trieda, nie closure — php artisan config:cache closure uložiť nedokáže:
// app/Mentions/ResolveMention.php
namespace App\Mentions;
use App\Models\User;
final class ResolveMention
{
public function __invoke(string $handle): ?User
{
return User::where('username', $handle)->first();
}
}
// config/comments.php — an invokable class, or [ResolveMention::class, 'someMethod']
'mention_resolver' => \App\Mentions\ResolveMention::class,
$comment = Comments::on($post)->body('thanks @alice!')->post();
$comment->mentions; // CommentMention rows (handle + optional mentionable)- Handle je @ nasledovaný písmenami, číslicami, _, . alebo - (@john.doe), končí však písmenom, číslicou alebo podčiarkovníkom — „vďaka @alice.“ teda spomína alice. Nesmie mu predchádzať znak slova, takže e-mailová adresa ako [email protected] zmienkou nie je.
- Resolver dostane handle bez @ a vráti Eloquent model alebo null. Vytvára sa cez kontajner, takže môže mať závislosti v konštruktore.
Kedy sa odošle CommentMentioned
- Len pri schválenom komentári a každej osobe raz. Komentár, ktorý moderovanie zadrží — require_approval, zhoda s blocklistom s akciou pending či hidden, skrytie moderátorom — neupozorní nikoho až do Comments::approve(); potom sa každá priradená zmienka odošle raz.
- Každý handle sa v komentári uloží raz. Úprava udalosť odošle len pre ľudí, ktorých komentár ešte neupozornil — handles, ktoré v tele zostali, si záznamy ponechajú, odstránené sa zmažú a opätovná zmienka tej istej osoby, hoci pod iným handle, nie je novou zmienkou.
- Skrytie a opätovné schválenie nikoho neupozorní dvakrát.
Resolver ako dvojica [trieda, metóda]
Namiesto invokovateľnej triedy môžete resolver nasmerovať na dvojicu [Class::class, 'method']. Aj táto trieda sa vytvára cez kontajner, takže dvojica zostáva kompatibilná s config:cache:
// config/comments.php
'mention_resolver' => [App\Support\MentionResolver::class, 'resolve'],
// app/Support/MentionResolver.php — built through the container
namespace App\Support;
use App\Models\User;
final class MentionResolver
{
public function resolve(string $handle): ?User
{
return User::where('username', $handle)->first();
}
}Skupinové zmienky
Resolver môže vrátiť aj skupinu — akýkoľvek objekt s rozhraním RoundlyConsulting\Comments\Contracts\MentionableGroup, ktorého mentionableMembers() vracia Eloquent modely. Implementujte ho na modeli (tím) alebo na obyčajnom objekte (@here). Handle sa potom rozbalí na členov skupiny:
// app/Mentions/Team.php — a group the resolver can return
namespace App\Mentions;
use App\Models\Team as TeamModel;
use RoundlyConsulting\Comments\Contracts\MentionableGroup;
final readonly class Team implements MentionableGroup
{
public function __construct(private TeamModel $team) {}
public function mentionableMembers(): iterable
{
return $this->team->members; // Eloquent models
}
}
// app/Mentions/ResolveMention.php
namespace App\Mentions;
use App\Models\Team as TeamModel;
use App\Models\User;
use RoundlyConsulting\Comments\Contracts\MentionableGroup;
final class ResolveMention
{
public function __invoke(string $handle): User|MentionableGroup|null
{
if ($team = TeamModel::where('handle', $handle)->first()) {
return new Team($team);
}
return User::where('username', $handle)->first();
}
}
Comments::on($post)->as($alice)->body('@design-team please review')->post();
// one CommentMention row per member, handle 'design-team' — never $alice herself- Každý člen sa pod handle skupiny uloží raz, ako vlastný záznam CommentMention — člen uvedený dvakrát má stále jeden záznam.
- Autor komentára sa vynechá, takže nikto nedostane upozornenie na vlastnú správu.
- Osoba, na ktorú vedie viacero handles — menom aj cez skupinu —, dostane upozornenie len raz.
- Skupina, v ktorej nikto nezostal (prázdna alebo len s autorom), uloží holý handle bez priradenia, ako nepriradenú zmienku. Člen, ktorý ešte nemá kľúč, sa preskočí.
Notifikácia spomenutých používateľov
use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Comments\Events\CommentMentioned;
Event::listen(function (CommentMentioned $event): void {
$event->mention->handle; // 'alice'
$event->mention->mentionable; // the resolved model (e.g. your User)
$event->mention->comment; // the comment that mentions them, as your comments.model class
});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.