friendsofvictoire/button-widget
Provides a configurable button widget for the Victoire CMS page builder. Editors insert call-to-action buttons and set labels, links, styles, and target options through a visual form, so no template edits or custom markup are required.
Architecture fit: fundamental mismatch. The premise of the request — evaluating this as a Laravel/PHP package — does not survive first contact with the artifact. friendsofvictoire/button-widget ships as FriendsOfVictoire\WidgetButtonBundle, a Symfony bundle (note the Bundle suffix and the WidgetButtonBundle repo name), not a Laravel package. It has no ServiceProvider, no laravel-package Composer type, and no facade or config publish stub. It is a single content-editing widget inside the Victoire CMS ecosystem, which means it is a leaf node in a dependency graph rooted at Victoire core: it expects the Victoire widget registry, a Doctrine ORM entity for the button, a Symfony Form type for the authoring UI, and a Twig template for render. Dropping it into a Laravel application is not an integration task; it is a port.
Integration feasibility: low, and not worth the cost. The bundle's value is one small authoring affordance — a button element with a label, a link destination, and presentation attributes, editable inside a CMS admin. There is no standalone runtime library, no HTTP client, no domain logic worth importing. The genuinely reusable artifact is the data contract (which fields a button block needs), not the code. That contract is recoverable in an hour of source reading; the code requires Doctrine, the Symfony DI container, Twig, and Victoire's widget lifecycle to do anything at all.
Technical risk: high, concentrated in abandonment. Zero stars, zero dependents, a composite score of 0, and an opportunity score of 18.26 are not neutral signals — they are the absence of any adoption, review, or maintenance trail. Concrete risks:
Key questions for the requesting team:
Stack fit: do not integrate; reimplement. The correct TPM recommendation is a concept port, not a code port. Target a native Laravel primitive — a Blade component (<x-button>) plus a small content-block field type in whichever admin panel we already run. That yields an Eloquent-backed model (or a JSON column on an existing blocks table), Laravel validation instead of a Symfony Form type, Blade instead of Twig, and container bindings instead of a bundle extension. Roughly four mappings carry the whole effort:
| Victoire construct | Laravel equivalent |
|---|---|
| Doctrine entity + mapping | Eloquent model or JSON block column |
| Symfony Form type | FormRequest + validation rules |
| Twig template | Blade component / partial |
| Bundle DI extension + widget registry | Service provider + tagged block registry |
Migration path. There is no data to migrate unless a Victoire instance is already in production. If one is, export the button widget rows first (label, destination, target, presentation class) and treat that as the acceptance fixture set. If one is not, the "migration" is a two-to-three day build of a native component against the recovered field contract, with no upstream dependency.
Compatibility. Treat the upstream as read-only reference material, pinned in a comment or an ADR — never in composer.json. If any code is copied verbatim, verify license first and vendor it with a provenance note; do not add a Composer requirement that will one day block a framework upgrade.
Sequencing:
rel/target handling.Maintenance. Adoption means permanent sole ownership of a fork with no upstream commits to rebase against. The bundle is effectively archived by neglect; every future PHP or Symfony major is a manual patch we author. Porting reduces the ongoing burden from "maintain a foreign bundle" to "maintain a 100-line Blade component," which is the only version of this that survives a framework upgrade cycle.
Support. No maintainer, no issue triage, no release notes. Internal support is whatever the team that ports it can reconstruct from reading the source. Budget for that reading time explicitly — it is small (the bundle is tiny) but it is not zero, and it is not amortized across anyone else.
Scaling. Runtime scaling is a non-issue: this renders a button. The scaling concern is organizational — every additional Victoire-derived bundle adopted compounds the same coupling and the same orphaned-fork liability. One is a curiosity; three is an architectural commitment to a dead ecosystem.
Failure modes, ranked by likelihood:
Ramp-up. Reading the bundle is fast; onboarding an engineer to the Victoire mental model (widget registry, DI extension conventions, Doctrine entity lifecycle) is not, and that knowledge has no reuse value outside this ecosystem. Porting inverts this: the deliverable is a Blade component any Laravel engineer on the team can read and change on day one.
Bottom line. Do not adopt. The 0-star, 0-dependent, score-0 profile is corroborated by the technical reality — this is a Symfony CMS leaf widget with no path into a Laravel application. Extract the field contract, build a native component, and record the decision.
How can I help you explore Laravel packages today?