Udalosti
Idempotentné volania bez zmeny — páčik tam, kde už je, alebo odobratie tam, kde nie je — nespustia žiadnu udalosť. Pri skutočnej zmene balík spustí práve jednu udalosť:
use RoundlyConsulting\Likes\Events\Liked;
class NotifyAuthor
{
public function handle(Liked $event): void
{
// $event->actor, $event->likeable, $event->type, $event->like
}
}| Udalosť | Kedy | Vlastnosti |
|---|---|---|
Liked | Páčik vznikne alebo sa obnoví | actor, likeable, type, like |
Unliked | Páčik sa odoberie | actor, likeable, type, like |
ReactionChanged | Reakcia sa zmení cez react() | actor, likeable, from, to, like |
- Zmena cez react() spustí len ReactionChanged — nikdy Liked ani Unliked. Keď react() zlúči viac reakcií do jednej, spustí navyše Unliked pre každú reakciu, ktorú odoberie.
- Súbežné požiadavky udalosť nezdvoja: spustí ju len požiadavka, ktorá záznam naozaj zmenila.
- Hromadné likeMany() / unlikeMany() spustia jednu udalosť pre každú položku, ktorá sa skutočne zmenila.
Registrácia listenerov
use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Likes\Events\Liked;
use RoundlyConsulting\Likes\Events\ReactionChanged;
// e.g. in AppServiceProvider::boot()
Event::listen(Liked::class, NotifyAuthor::class);
Event::listen(function (ReactionChanged $event): void {
// $event->from, $event->to — a clean transition, never an unlike + like
});Udalosti používajú SerializesModels, takže listenery vo fronte fungujú ako zvyčajne.
Voliteľne: uložený stĺpec s počtom
Balík nikdy nepridáva stĺpce do vašich tabuliek. Pre počty v O(1) použite withLikesCount() / loadCount('likes'), alebo si udržiavajte vlastný stĺpec s počtom cez malý listener — napríklad stĺpec likes_count na cieľovom modeli:
use RoundlyConsulting\Likes\Events\Liked;
use RoundlyConsulting\Likes\Events\Unliked;
class SyncLikesCounter
{
public function increment(Liked $event): void
{
$event->likeable->increment('likes_count');
}
public function decrement(Unliked $event): void
{
$event->likeable->decrement('likes_count');
}
}Event::listen(Liked::class, [SyncLikesCounter::class, 'increment']);
Event::listen(Unliked::class, [SyncLikesCounter::class, 'decrement']);Zaregistrujte ho sami — balík ho automaticky neregistruje. Zmena reakcie nespustí Liked ani Unliked a react(), ktorý zlúči viac reakcií, spustí Unliked pre každú odobratú, takže počet zostane správny.
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.