friendsofvictoire/html-widget
A small Symfony bundle that adds an HTML widget to the Victoire CMS, letting editors drop raw HTML, embeds, and custom markup into any widget slot without touching templates.
Architecture fit
The first finding is a category mismatch that must be resolved before any engineering time is spent: despite being filed as a "Laravel/PHP package," friendsofvictoire/html-widget is a Symfony bundle (WidgetHtmlBundle) built for Victoire DCMS, a Symfony-based content management system. It is not a Composer package with a Laravel service provider, and it does not target Laravel's container, Blade, or Eloquent.
Architecturally, the package is a thin content widget: it registers a "HTML" block type with Victoire's widget subsystem so editors can drop raw HTML into a page template, then renders it through Victoire's Twig pipeline. Its value is entirely derived from Victoire's widget registration, business-entity templating, and slot-resolution machinery. Outside that host application, there is essentially no standalone functionality — the bundle is a plugin, not a library.
For a Laravel codebase, this is a non-fit. Adopting it would mean either standing up a Symfony kernel alongside Laravel (dual-framework operational burden) or reimplementing Victoire's widget contracts, at which point the package contributes almost nothing you couldn't write in an afternoon.
Integration feasibility
Low. There is no adapter path that preserves the package's intent. Symfony bundles are autoloaded and bootstrapped via Kernel::registerBundles(); Victoire widgets additionally depend on Victoire's Widget model, view/entity mapping, and Twig namespaced templates. None of that maps onto Laravel's package discovery.
Technical risk
High, and concentrated in provenance rather than code quality:
composer.json. On a modern PHP 8.x runtime, resolution will likely fail outright or require --ignore-platform-reqs hacks that shift risk downstream.Key questions
composer.json actually need — is there any Symfony footprint, or is this purely a Laravel shop?composer.json before anything else.)Stack fit
Poor for Laravel, marginal even for Symfony. If the target application is not Victoire, the package should be rejected at triage. The honest framing for stakeholders: this is not a library we integrate, it is a plugin we would have to host.
Migration path
Recommended path is do not adopt. The functional requirement — "let editors place a sanitized HTML block on a page" — is a small, well-understood problem with mature solutions. A minimal in-house implementation is roughly:
blocks table (or JSON column) with type, payload, order.type: html through a sanitizer (e.g. mews/purifier wrapping HTML Purifier) with an explicit allowlist of tags and attributes.script-src so a sanitizer bypass isn't automatically an incident.That is days of work, fully owned, with a test suite you control. If a Symfony application is genuinely in play, the migration path is instead: verify Victoire version compatibility → pin the bundle to a fork we maintain → treat it as vendored code.
Compatibility
Unverified and likely poor. Confirm before committing: supported Symfony major versions, PHP constraint, Twig version, and whether the widget registration API still matches the Victoire release in use. Any of these failing turns the integration into a fork-and-patch exercise, which changes the cost model entirely.
Sequencing
composer.json, README, last commit date, open issues. Confirm the Symfony/Victoire dependency. Produce a go/no-go.Maintenance
Effectively zero upstream maintenance, which means 100% internal maintenance from day one. The moment we depend on it, we own the code path — including the Twig template, the widget registration, and any Symfony upgrade breakage. Budget for it as internal code, not as a dependency.
Support
No community, no issue triage, no maintainer SLA, no security disclosure process. Any defect becomes our defect with no upstream escalation route. For a component that renders untrusted editor input, the absence of a security response channel is the single biggest operational concern.
Scaling
Runtime cost is negligible — the widget stores and emits a string; rendering is O(1) per block. The scaling risk is not throughput, it is blast radius: an unsanitized HTML block is a persistent injection point. In a multi-tenant or multi-author CMS, one compromised editor account becomes stored XSS against every reader and every admin session. Mitigations (HTML Purifier on write, CSP on read, audit logging on block edits) are mandatory and must be designed in, not bolted on.
Failure modes
Ramp-up
High relative to the package's apparent simplicity. A team without Victoire experience must learn its widget model, business-entity templating, and Twig layout conventions before the bundle does anything visible. For a Laravel team, ramp-up is effectively infinite — there is no incremental path to a working integration.
TPM recommendation: Do not adopt. The 0-star / 0-dependent / score-0 profile combined with a framework mismatch and an inherent XSS surface makes this a poor risk-adjusted choice. Scope the underlying need (sanitized content blocks) and build a small owned component on the native stack.
How can I help you explore Laravel packages today?