Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Button Widget Laravel Package

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.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

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:

  • Dependency deadlock. Victoire-era packages constrain to Symfony 2.x/3.x and PHP 5.x/7.x. A current Laravel (10/11, PHP 8.2+) requires Symfony 6/7 components. Composer will not resolve both trees; the conflict surfaces as an unresolvable constraint graph, not a clean error.
  • No security surface monitoring. With no dependents and no release cadence, this code will never appear in a CVE advisory feed. Any vulnerability is ours to find.
  • Untrusted-input rendering. A button widget accepts a URL and a link target and renders them into markup. Open-redirect and XSS exposure in the authoring-to-render path is the exact class of defect that goes unnoticed in an unreviewed, untested widget. Assume no test suite.
  • Unknown license posture. Before lifting any source, confirm the Victoire org's license terms; "public on GitHub" is not a license grant.

Key questions for the requesting team:

  1. What is the actual product need — a CMS-authored button block, or a reusable button UI component? These have very different solutions.
  2. Is there an existing Symfony/Victoire footprint in our estate? If yes, this evaluation changes entirely; if no, the bundle is inert.
  3. Who is the content author, and in which admin surface? That determines whether we need Filament, Nova, Statamic, or a hand-rolled block editor.
  4. Is the intent to copy source, or to reimplement the concept? Only the latter is viable at our stack level.
  5. Who owns the resulting code in perpetuity? There is no upstream to hand it back to.

Integration Approach

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:

  1. Confirm need and owning admin surface (question 1 and 3 above). Stop here if the answer is "we already have a button component."
  2. Extract the field contract from upstream source and freeze it as a schema decision.
  3. Build the Blade component with an allowlist for link schemes and explicit rel/target handling.
  4. Wire the authoring field into the admin panel with server-side validation of the destination URL.
  5. Add render tests covering malicious and malformed URLs; this is the step the upstream almost certainly skipped.
  6. Close out with an ADR recording why we did not adopt the bundle, so the question does not recur.

Operational Impact

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:

  • Composer resolution failure at install time (near-certain on a modern stack) — surfaces early, cheap to detect, blocks the whole approach.
  • Silent render defects in the link/URL path — XSS or open redirect in authored content, no upstream advisory to warn us.
  • Container/bootstrap mismatch if someone forces the bundle in — widget registration never fires, button renders empty, diagnosed slowly.
  • Orphaned content blocks after an admin-panel upgrade or a schema change — button instances in stored content lose their field mapping with no migration owner.
  • Framework upgrade lockout — the dependency sits in the graph and blocks a PHP or Symfony bump eighteen months later, long after the original adopter has left.

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.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
ignibyte/aic-framework
glavweb/data-schema-bundle
glavweb/datagrid-bundle
tacticmedia/scim-server
uni-method/frame
neika-ai/sdk
adachsoft/php-code-style
pharaonic/laravel-notification-dependencies
beautinow/translug
dev-brainiac/bot-cloaked
octoberrain/html
octoberrain/extension
octoberrain/exception
octoberrain/contracts
frankyso/ipaymu
3mdikram/worldmoneywords
snowsoft/config
itmosoft/laravel-subscriptions
larva/laravel-ai-qwen
adachsoft/api-version-bundle