helios-ag/fm-summernote-bundle
Symfony bundle that integrates the Summernote WYSIWYG editor with FM (FormManager), providing a ready-to-use form type and frontend assets for adding rich-text editing to textareas with minimal configuration.
Architecture fit — unchanged: poor for a Laravel codebase. The 1.0 release is a Symfony modernization milestone, not a framework-bridging one. The substance of the changelog is Symfony 5/6 alignment (Symfony5 changes #29, Updates for sf6 #37, Add symfony bundle config #32) plus dependency automation (Upgrade to GitHub-native Dependabot #30, symfony-dependency-injection-test ^6.1 #45). Nothing in the release introduces a Laravel service provider, Blade directive, or any decoupling from Symfony primitives. The architecture remains:
Extension that loads service definitions and a configuration tree — now formally published as bundle config in config/, which deepens rather than reduces the Symfony coupling.SummernoteType).init.html.twig is touched directly in this release, confirming the templating surface is still Twig).What 1.0 actually changes for us:
| Change | Signal | Relevance to Laravel |
|---|---|---|
| Symfony 5/6 support | Package is maintained against a current Symfony | Raises the floor to PHP 8-era constraints; still pulls Symfony into a Laravel app |
basePath → base_path config rename |
Breaking change (masked by the 0.2 → 1.0 semver jump) | Only affects Symfony adopters; confirms config surface is still the integration contract |
| Language selection in config (#11) | Genuinely useful feature | Directly portable — maps to a config/summernote.php key |
| "Custom front" option (#15) | Flexibility for toolbar/theme overrides | Portable concept; reimplement as a Blade slot/prop |
| jQuery 2.x compatibility (#13) | Backward-compat with a deprecated jQuery line | A modernization negative — signals the bundled asset line lags current front-end expectations |
| StyleCI / typo / README / issue-template churn | Low-ceremony release hygiene | Neutral; inflates the changelog's apparent weight |
Integration feasibility — unchanged: extraction only. The 1.0 tag improves install-ability on Symfony 6 stacks, which is irrelevant to a Laravel composer.json. Installing still means dragging Symfony Config, DependencyInjection, Form, and Twig into a Laravel container for one form widget. The realistic path remains treating the repo as a reference implementation and reimplementing in Blade + Vite — and 1.0 slightly improves that path by documenting a cleaner, current config schema to copy.
Technical risk:
| Risk | Severity | Change since prior assessment |
|---|---|---|
| Framework mismatch | High | Unchanged — no Laravel surface added in 1.0 |
| Project maturity | High | Marginally improved (Dependabot, Symfony 6, issue templates) but still single-maintainer, ~7 stars, 0 dependents |
| Transitive weight | Medium | Unchanged — Symfony Form/Twig/Config for one editor |
| Asset pipeline drift | Medium | Unchanged/worse — jQuery 2.x compat implies a legacy asset line; no Summernote version bump in the notes |
| Security surface | High | Unchanged — still no server-side sanitization; stored-XSS control remains ours |
| Version constraints | Medium | Raised ceiling (Symfony 6) but the 0.2 → 1.0 jump carries an unlabelled breaking config rename |
| Semver discipline | Medium | Pre-1.0 → 1.0 with a silent config key rename suggests breaking changes may not be curated going forward |
| License | Low | MIT, clean |
Key questions (revised):
--ignore-platform-reqs?language config option wired through to Summernote's i18n files, or does it only set a string? If assets aren't shipped, we must source locale files ourselves regardless.Stack fit — unchanged: mismatch, with the same narrow salvage path. Laravel's idiomatic answer remains npm install summernote + a Vite entry + a Blade component + a FormRequest validation rule. The 1.0 release does not create a Laravel path; it makes the Symfony path more current, which is orthogonal to our roadmap.
Recommended approach — extract, don't install (now with a better config source):
composer.json. 1.0 gives us a cleaner config schema to harvest than 0.2 did — lift the option set (toolbar, height, language, airMode, base_path/asset base, custom-button definitions) into config/summernote.php, using the new base_path naming so we don't inherit the deprecated key.resources/js/components/summernote.js initializes the editor; <x-summernote name="body" :value="$post->body" /> renders and initializes. Assets through Vite. Treat the release's jQuery 2.x compatibility work as a warning: pin a current Summernote major and verify it against our jQuery-free or modern-jQuery front end.{!! !!} only on sanitized content. 1.0 adds nothing here — no security-relevant entries in the changelog at all.language config and a "custom front" escape hatch are worth having; implement the latter as a Blade slot, not a Twig block override.Migration path if the Symfony bundle is already in use. 1.0's basePath → base_path rename is the migration hazard: any existing Symfony-side config (or internal documentation copied from 0.2) must be renamed. If we are porting from Symfony to Laravel, capture the 1.0 config as the frozen baseline, then stand up the Blade/Vite equivalent in parallel and shadow-compare sanitized output on a record sample before cutover. Do not bridge by running the bundle inside Laravel.
Compatibility: 1.0 raises the Symfony ceiling, which is irrelevant to us but does mean the package now targets PHP 8-era runtimes — confirm it doesn't force a constraint our Laravel app would inherit transitively (another reason not to install). Separately, verify the Summernote and jQuery versions the bundle now assumes; jQuery 2.x support implies it tolerates a 2013-era jQuery, not that it ships a current editor.
Sequencing (largely unchanged, one step reprioritized):
summernote + Vite + Blade component (1–2 days).base_path naming.Maintenance. 1.0 modestly improves the maintenance story for Symfony users: Dependabot is native, Symfony 6 is supported, and dependency-injection tests were updated. For us, adopting it still means owning a Symfony-shaped dependency inside a Laravel app where no other Symfony code exists. The native path keeps our surface at one npm dependency plus a Blade component. Note the release cadence is dominated by StyleCI/typo/README commits — the package is being tidied, not actively developed, so bug absorption still falls to us.
Support. Bus factor is unchanged and is now the dominant risk: 1.0 adds four first-time contributors, but their contributions are typo fixes, a bracket fix, a config rename, and a language option — not evidence of a sustained maintainer bench. There remains no Laravel community, no Stack Overflow trail for this bundle in a Laravel context, and no upstream audience that would surface our integration bugs. Contrast with summernote itself.
Scaling. Unchanged: the editor is a per-request client-side asset with no meaningful server scaling dimension. The scaling-relevant decision is still payload — enforce image upload to object storage instead of inline base64, and cap stored HTML length. Independently, the jQuery 2.x compatibility work hints at legacy client-side assumptions; confirm the bundle isn't steering us toward an old jQuery to satisfy a front-end stack we don't have.
Failure modes:
| Failure | Symptom | Mitigation |
|---|---|---|
| Composer resolution conflict | Install/build breaks on Symfony constraints | Do not install; extract pattern |
Silent config rename (basePath → base_path) |
Copied 0.2-era config silently ignored after upgrade | Use 1.0 names; document the rename in our port notes |
| Asset pipeline mismatch | Editor loads unstyled or 404s CSS | Serve via Vite, pin Summernote version |
| Legacy asset assumptions | Forced old jQuery/Summernote line to match bundle | Pin our own Summernote major; ignore bundle's jQuery floor |
| Missing sanitization | Stored XSS in rendered content | Server-side allow-list sanitizer + tests |
| Editor version drift | Toolbar/Bootstrap styling breaks on upgrade | Lock npm version, visual regression check |
| Maintainer abandonment | No security patches for the glue layer | Only matters if adopted — another reason not to |
| CSP violations | Inline init scripts blocked | External module + nonce, no inline handlers |
Ramp-up. Near zero for the native path. Non-trivial for the bundle path and unchanged by 1.0 — a developer must understand Symfony bundles, DI extension config trees, and the Form component to debug it inside Laravel, knowledge the team has no other reason to hold. 1.0's cleaner bundle config actually increases the amount of Symfony-specific configuration a newcomer must read.
Verdict — non-adoption stands, with the rationale updated. The 1.0 tag is a real milestone but a framework-internal one: Symfony 5/6 support, Dependabot, issue templates, and two modest features (language, custom front). It does not move the package toward Laravel, does not address sanitization, does not refresh the underlying editor assets, and carries an unlabelled breaking config rename behind a semver jump — which slightly lowers confidence in future upgrade predictability. The correct TPM action is still a documented non-adoption: cite the unchanged framework mismatch, the orphaned dependency profile that 1.0 only cosmetically improves, and the fact that the security-critical layer lives outside the package. Harvest the 1.0 config schema (including language and the base_path naming), build the 1–2 day native equivalent, and spend the saved effort on sanitization and media handling — the parts that actually determine whether the feature is safe in production.
How can I help you explore Laravel packages today?