nurikabe/star-rating-bundle
A Symfony bundle for adding reusable star-rating fields to forms and views, making it easy to collect and display user Ratings with lightweight, configurable integration and Twig-friendly rendering.
Architecture fit — poor (framework mismatch). Despite being catalogued as a "Laravel/PHP package," nurikabe/star-rating-bundle is a Symfony bundle, not a Laravel package. Its architecture is Symfony-specific by construction: a bundle class registered in the Symfony kernel, a DI extension for service/config wiring, a Symfony FormType, and a Twig extension exposing a rendering helper. Laravel has no equivalent bundle/kernel registration surface, no Symfony form component in the default stack, and no Twig. The only portable artifacts are the underlying FyneWorks Star Rating widget (a client-side, jQuery-era JavaScript plugin) and the HTML/CSS conventions it emits. Roughly 90% of the package's code is Symfony glue that is dead weight in a Laravel context.
Integration feasibility — low as-is; moderate only as a widget extraction. A Laravel integration would not "install the package" — it would mean vendoring or forking the JS widget, adding it to the Vite/Mix asset pipeline, and rebuilding the server-side surface as a Blade component or Livewire component plus a validation rule and an Eloquent cast/column convention. That is a rewrite, not an integration, and the package contributes little beyond a reference implementation of the markup.
Technical risk — high and concentrated in abandonment.
^2.x constraint. In a modern Laravel app (PHP 8.2+, no jQuery), both are friction points; Composer will either refuse to resolve or require --ignore-platform-reqs hacks that poison the lockfile.Key questions for the requester:
Stack fit — none out of the box. Target stack (assumed Laravel 10/11, PHP 8.2+, Vite, Blade/Livewire, no jQuery) is two major generations removed from what this bundle targets. Do not attempt a Composer require. Treat the repository as reference material, not a dependency.
Recommended path — extract-and-reimplement, in preference order:
aria-label and a width-based clip for fractional stars). For input, a small Alpine.js component or a Livewire rating property with a hidden input is ~40 lines and has zero legacy surface.resources/js/vendor/, import it in app.js, and document the pinned version and origin SHA. Wrap it in a Blade component with a @once script include so it initializes per-instance.FormType for Symfony's current AbstractType, and swap the Twig extension for a Twig runtime.Migration path if legacy code already depends on it: inventory every usage of the form type and Twig function, map each to the replacement Blade component/Alpine component, and replace call sites in one pass. Because the package is a leaf (0 dependents upstream), there is no ecosystem to stay compatible with — only your own call sites.
Compatibility checklist before committing:
composer.json constraints — expect them to fail; quantify the diff.<script> initialization and inline styles will need nonces or hashes.role="radiogroup", and aria-checked. Assume you must add it.Sequencing (2–3 day spike):
Maintenance — the dominant cost. This package transfers maintenance to you on day one. There is no upstream to patch; every PHP upgrade, CSP tightening, or design refresh is your team's work. A frozen jQuery plugin also accrues quiet rot: it will keep working until it doesn't, and the failure usually arrives during an unrelated framework or bundler upgrade. Budget a standing ~1 day/quarter of "is it still rendering and is it still accessible" review.
Support — none. No maintainer activity since 2015, 10 stars, 0 dependents means no Stack Overflow corpus, no issue history to mine, and no one to escalate to. Internal documentation must be written at adoption time, because it cannot be reconstructed later. Name a single owner in the repo.
Scaling — effectively a non-issue. The widget is client-side, per-form, and tiny; it adds no server load, no queries, and no cache pressure. The only scaling-adjacent concern is asset weight: a jQuery dependency may pull ~30KB gzipped into the bundle for one control. On a high-traffic page, prefer the dependency-free alternative on performance grounds alone.
Failure modes to pre-plan for:
null. Mitigate with a server-side validation rule that requires a rating and an integration test asserting the hidden input's presence.composer require and breaks the lockfile. Mitigate by not publishing it as a dependency at all.radiogroup semantics.Ramp-up — low per-engineer, high organizationally. The code itself is trivial to read; any mid-level developer can fork it in an afternoon. The real ramp cost is institutional: onboarding new engineers to a mystery vendored file with no history, no tests, and no upstream. Every future maintainer pays the "why is this here?" tax. Offset it with a resources/js/vendor/README.md recording origin URL, commit SHA, license, the fork rationale, and the replacement trigger.
Recommendation. Do not adopt. Score 0.33 reflects a package that is architecturally mismatched (Symfony vs. Laravel), temporally stale (2015), and socially unvalidated (10 stars, 0 dependents). Rebuild the capability natively in ~40 lines with Alpine/Livewire or adopt a maintained CSS/SVG approach; keep this repository only as a markup reference. Revisit only if the target is confirmed as a legacy Symfony 2 application, in which case scope it as a rewrite, not an install.
How can I help you explore Laravel packages today?