balajidharma/laravel-reaction
Add like, love, and custom reactions to Laravel Eloquent models with balajidharma/laravel-reaction. Simple traits and APIs let you attach reactions, count them, and check user reactions, making engagement features easy to integrate.
What the release actually tells us. The only documented change in v2.0.1 is Laravel 13 support. That is a maintenance signal, not a feature signal. The far more important fact is the version delta: the package moved from v1.0.6 to v2.0.1, which means a 2.0.0 release exists and almost certainly carries breaking changes that are not described in the notes provided. Any evaluation of this package for our stack has to be gated on reading the 2.0.0 changelog and any upgrade guide before we treat v2.0.1 as a drop-in.
Architecture fit. laravel-reaction is a small, single-purpose package: a polymorphic reaction table plus traits applied to the "reactable" model and the reacting model (typically User). That shape fits Eloquent natively and is the standard way to model likes/upvotes/emoji responses on UGC — posts, comments, reviews, tickets. For us the fit is good wherever we need lightweight, multi-type reactions without standing up our own schema, service, and query layer. It is not a fit for anything requiring reaction analytics at scale, weighted ranking, or cross-service reaction data — those would need aggregation and caching we own anyway.
Integration feasibility. Low-to-moderate. Typical install is a composer require, publishing a migration and config, and adding two traits. The real cost is not installation; it is (a) confirming what broke in 2.0.0, and (b) owning the aggregate/counting layer on top, which packages in this category usually leave to the application.
Technical risk.
Key questions to answer before committing.
Stack fit. The package is a natural fit for a Laravel monolith on Eloquent with UGC. It assumes a relational database and a single application boundary; it does not help if reactions must be shared across services or if we need event-driven reaction processing. Confirm the PHP floor for the 2.x line early — Laravel 13 support usually implies a higher minimum PHP than we run today.
Compatibility and the honest recommendation. Do not adopt v2.0.1 as an isolated change. Treat it as part of the Laravel 13 upgrade workstream and pin explicitly:
main.Migration path (1.x → 2.x).
Sequencing. Framework upgrade → package 2.x → internal adapter/counter layer → feature work. Do not let feature teams build against 1.x traits in the window before the upgrade, or the migration cost doubles.
Maintenance. Low code footprint, but a single-maintainer dependency. Assign an owner, subscribe to releases, and keep a quarterly check for abandonment or a 3.x jump. Budget a fork-if-abandoned contingency; the package is small enough that vendoring is realistic.
Support. Community OSS, no SLA, no vendor escalation. Support burden lands on our own on-call. Document the traits at our call sites so a future maintainer does not have to read the package source to understand our reaction model.
Scaling. The reaction table is the risk surface. Expect it to be one of the highest-write, highest-row-count tables in a social/UGC product. Plan for composite indexes on (reactable_type, reactable_id) and a uniqueness constraint on the reactor side, and decide deliberately between live aggregate queries (correct, slower) and denormalized counters (fast, drift-prone). At meaningful volume, serve counts from a cache and treat the table as the ledger. Also confirm N+1 behavior on list endpoints — eagerly loading reaction state for a feed is a common performance trap.
Failure modes to design against.
Ramp-up. A Laravel developer can integrate this in half a day: install, publish, add traits, render reactions. Budget 1–2 additional weeks of engineering (not package learning) for the parts the package will not do for us — aggregate/counter strategy, authorization and rate limiting, feed-level eager loading, and the upgrade/migration effort if we are crossing 2.0.0. Product and design ramp-up is near zero; the reaction vocabulary and interaction model are ours to define regardless of the package.
How can I help you explore Laravel packages today?