msalsas/voting-bundle
A Symfony bundle that adds a flexible voting system to your Doctrine entities. Let users upvote or downvote items anonymously or as registered voters, store votes via Doctrine, and display results with built-in Twig helpers.
Votable contract on any entity, a persisted Vote record, a manager/service that toggles and tallies votes, and events hooking into the lifecycle. That's a usable checklist for scoping an MVP feature (feature-request boards, comment ranking, content "helpful" signals, review scores) even if we never install it.Important caveat up front: this is a Symfony bundle, not a Laravel package. It depends on Symfony's DI container, Doctrine entities, Twig helpers, and (in the era it was written) likely FOSUserBundle and annotation-based configuration. It will not drop into a Laravel app. Treat it as a reference implementation and design spec, not a dependency.
Consider adopting it (or its patterns directly) only when:
Votable interface to copy rather than design.Look elsewhere — or build a small in-house service — when:
To executives (one paragraph): We evaluated this library as a shortcut for adding voting/rating to the product and recommend against adopting it as a dependency. It has effectively zero adoption (14 stars, no dependent projects) and is built for Symfony, not our Laravel stack — meaning no support, no security patch path, and a porting cost anyway. Its permissive MIT license does let us legally reuse its design, so we get the useful part — a proven, conventional data model for votes and ranked content — for the cost of a few engineering days, without inheriting an unmaintained dependency. Net: same feature, lower long-term risk, no vendor lock.
To engineering (the ask): Don't add msalsas/voting-bundle. Use it as a reference for the Votable interface, vote entity shape, and vote lifecycle events. Build a thin internal VoteService behind an interface (vote, unvote, toggle, scoreFor, rankedQuery), with per-vote rows plus a denormalized counter, and anonymous-vote handling as an explicit decision rather than an inherited default. If we want a maintained off-the-shelf option, evaluate a Laravel-native likes/votes package against the same interface — swapping it later should be a one-file change.
Bottom line for the roadmap: voting is a commodity engagement primitive. Ship it small, own the abuse and ranking logic, and revisit weighted/decayed ranking only if engagement data justifies it.
How can I help you explore Laravel packages today?