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

Fm Bbcode Bundle Laravel Package

helios-ag/fm-bbcode-bundle

Symfony bundle that integrates the FM BBCode parser, making it easy to parse and render BBCode in your applications. It provides a configurable service and Twig filter for converting BBCode to HTML.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Verdict up front: unchanged, and the 7.0 release strengthens rather than weakens the original conclusion. helios-ag/fm-bbcode-bundle is a Symfony bundle (Composer type symfony-bundle) whose entire integration surface — kernel registration, DependencyInjection extension, Configuration tree, Twig bundle wiring — assumes a Symfony full-stack kernel. The 7.0 note ("Symfony 3 without any deprecation messages") is a deprecation-cleanup pass against Symfony 3, which reached end of life in January 2019. A maintenance release that re-baselines on an eight-year-old EOL framework line does not move this package toward a modern Laravel stack; it confirms the maintainer's target is Symfony 3, i.e. the Laravel 5.x era. Package score (~4.95) and opportunity score (~14) still read "low value, low momentum."

Architecture fit

  • The bundle remains a thin configuration/wiring layer over an external BBCode parser (Decoda-family): a service definition, a config tree (fm_bbcode-style keys for tag whitelists, emoticon maps, URL/video handlers, HTML passthrough rules), and Twig filters/extensions.
  • Laravel does not boot Symfony bundles. It consumes Symfony components (HttpFoundation, Console, Routing, Process, ErrorHandler) at current majors but uses Illuminate\Container, its own service providers, its own config repository, and Blade — not Twig by default. There is no Kernel::registerBundles() path to hook into.
  • Dependency-level conflict is the hard blocker, and 7.0 does not relieve it: a release that declares Symfony 3 compatibility necessarily pins symfony/framework-bundle and twig/twig to 3.x-era constraints. A modern Laravel app pins symfony/* to current majors; Composer either fails the solver or drags symfony/framework-bundle in as a transitive dependency. Both outcomes are unacceptable.
  • Net: the bundle's value is the curated parser configuration, not the code. That value is ~200–400 lines of config plus a thin call site — portable; the package itself is not.

Integration feasibility

  • Direct composer require into Laravel: not feasible, and 7.0 changes nothing here. The version jump to a 7.x major also means any existing constraint research against the 3.x line is stale; there is no published UPGRADE guide beyond a single line, so even the Symfony-side diff is opaque.
  • Fork-and-strip (keep config, replace bundle classes with a Laravel service provider, retain the underlying parser): feasible if the underlying parser runs on PHP 8.x. The 7.0 note gives no signal on PHP 8 support and explicitly targets Symfony 3 (PHP 5.5–7.x era). That remains the unknown to spike first — 2016-vintage PHP breaks on PHP 8 via removed create_function, dynamic-property deprecations, /e-modifier-era regex, and untyped Symfony interface signatures.
  • Re-implement on a maintained parser (s9e/TextFormatter, mature BBCode plugin, actively maintained): still the most feasible path, with a config-parity layer to preserve tag semantics.

Technical risk

  • Security (highest): user-generated BBCode with any HTML-passthrough capability is a textbook XSS surface. An effectively unmaintained parser means any sanitization bypass is permanently unfixed, with no upstream to patch and no CVE feed watching it. The 7.0 release is a deprecation cleanup, not a security release — it should not be read as evidence of a security response process.
  • Abandonment/liveness (materially revised by 7.0): the record is no longer "no release since March 2016." It is now "near-dormant, sporadic single-maintainer releases, most recent one limited to Symfony 3 deprecation hygiene." Zero Packagist dependents, no issue triage, bus factor of one, and a headline release that does not modernize the framework or PHP floor. Downgrade from "abandoned" to "dormant," not to "maintained."
  • EOL compounding: depending on anything that requires Symfony 3 means inheriting an EOL framework's unpatched surface in addition to the parser's, with no upgrade path offered by 7.0.
  • Legal: NOASSERTION license classification is unresolved and unaddressed by this release. Must be cleared by legal before any distributed (on-prem/SDK) offering; a GPL-family finding would change the product decision.
  • ReDoS/CPU: BBCode parsers are regex-heavy; unbounded input on hostile payloads can spike CPU. Deprecation-cleanup releases typically do not touch regex construction.
  • Silent content degradation: swapping parsers changes rendering of legacy posts (nested quotes, tables, code fences). Users notice.
  • Release hygiene: a major version bump documented in one sentence is itself a risk signal — consuming 7.0 without a readable changelog means adopting unknown breaking changes blind, on top of everything else.

Key questions

  1. What is the actual product requirement — BBCode ingestion from legacy/imported content, or BBCode authoring for new posts? (If ingestion-only, parse once at import and store rendered HTML; the runtime dependency disappears.)
  2. Does anything we accept require raw HTML passthrough inside [html] tags? If yes, the risk profile changes materially and a sanitizer is mandatory.
  3. Is the license confirmed permissive in writing? (Unchanged by 7.0.)
  4. What is the corpus size and its BBCode dialect (phpBB2, vBulletin, custom)? Dialect fidelity, not library choice, drives migration effort.
  5. Is a Symfony host in scope anywhere, or is Laravel the only target? (7.0 confirms the package's own answer is "Symfony 3 only.")
  6. New: does any 7.x branch raise the PHP floor to 8.x or move to a supported Symfony major? The release notes say no — confirm on the tag itself before any fork/spike work, since it determines whether the fork branch is viable at all.
  7. Who owns this dependency after delivery — is there an internal maintainer for a vendored fork?

Integration Approach

Stack fit

  • Poor as-is, unchanged by 7.0. Recommended architecture: a BbcodeService contract in the app layer, one adapter implementation, a BbcodeServiceProvider binding it. The adapter wraps s9e/TextFormatter (BBCode plugin) — PHP 8.x compatible, maintained, configurable tag set, no Symfony coupling.
  • If dialect fidelity to the bundle is essential, port the tag whitelist / emoticon map / URL-video handler definitions from the bundle's Configuration into plain PHP arrays and feed them into the new adapter. That preserves behavioral parity without framework baggage.

Migration path

  • Phase 0 — Legal/license confirmation and a written dialect spec (sample corpus of 200–500 real posts covering quotes, lists, code, tables, links, images, emoticons).
  • Phase 1 — Timeboxed spike (2 dev-days): check out the 7.0 tag, diff it against the last 3.x release and against the original 2016 release, and attempt a fork on PHP 8.3 against the corpus. In parallel, spike s9e/TextFormatter on the same corpus. Compare. The 7.0 tag is the correct fork base only if it actually advances the PHP floor; verify, don't assume.
  • Phase 2 — Decision gate: fork-and-modernize vs. re-implement on s9e. Default expectation remains re-implement.
  • Phase 3 — Build adapter + service provider behind a feature flag; no call site changes yet.
  • Phase 4 — Parity harness: golden-file diff of rendered output (old vs. new) on the corpus; XSS fuzz suite (OWASP payload list, encoding tricks, nested/malformed tags).
  • Phase 5 — Backfill: re-render stored content into a cached HTML column; keep raw BBCode immutable.

Compatibility

  • Target PHP 8.1+ and current Laravel LTS only. Explicitly do not attempt to support the package's Symfony 3 matrix — no business case, and it forces a pinned, EOL dependency tree. 7.0 targets exactly that EOL matrix, so it is out of scope for us by construction.
  • Re-verify corpus dialect against the chosen parser before committing; mismatches remain the main schedule risk.

Sequencing Legal → dialect spec → dual spike (7.0 fork vs. s9e) → decision gate → adapter → parity + XSS harness → flag-on canary (internal users) → backfill → flag removal. The spike must precede any date commitment; the fork branch has an unbounded tail and should carry an explicit kill criterion (e.g., >5 dev-days without a green corpus). Add one step to the spike: read the 7.0 tag's diff, since a one-line release note is not a changelog.

Operational Impact

Maintenance

  • Owning a vendored fork of a dormant Symfony-3 bundle means inheriting 100% of its maintenance — PHP major upgrades, parser bug fixes, security patches — with no meaningful upstream and no community. 7.0 removes Symfony 3 deprecation noise but does not create a maintenance relationship we can lean on; it is one commit by one person against an EOL stack. That is a permanent, low-glamour tax.
  • Using a maintained parser instead reduces ongoing cost to config upkeep and occasional dialect tweaks.

Support

  • Support burden is asymmetric: parser issues surface as user-visible rendering bugs ("my quote broke," "my code block ate my post") and land on support as product defects, not dependency issues.
  • No Stack Overflow corpus, no vendor to escalate to, and an upstream issue tracker that has not demonstrated responsiveness. Internal runbook is mandatory.
  • The one-line 7.0 note is the entire release documentation for a major version; assume any internal question about "what changed in 7.0" is answered only by reading the diff.

Scaling

  • Parsing is CPU-bound and synchronous. Cache rendered HTML keyed by hash(raw_content + parser_version); invalidate the whole cache on parser upgrade. Steady-state cost approaches zero; CPU is confined to first-view and backfill.
  • For backfill over large corpora, run in queued batches with rate limiting; never inline into a web request.
  • Guard input size (e.g., 64–128 KB) and nesting depth to bound worst-case parse time.

Failure modes

  • Parser fatal/exception on malformed input → post fails to render. Mitigation: try/catch at the adapter boundary, fall back to escaped plain text, emit a metric.
  • ReDoS / pathological nesting → request timeout or worker saturation. Mitigation: input caps, timeouts, queue large payloads.
  • XSS via sanitization bypass → trust and compliance incident. Mitigation: strict tag allowlist, output through an HTML sanitizer, CSP, regression fuzz suite in CI. A deprecation-cleanup release provides no assurance here.
  • Silent rendering drift after upgrade → user-visible content change. Mitigation: golden-file parity tests gating any parser/config change.
  • Dependency resolution breakage on Laravel upgrade (if the bundle were ever installed directly) → blocked framework upgrades, i.e. an EOL ceiling on the whole app. 7.0 pins the ceiling to Symfony 3 specifically.

Ramp-up

  • Symfony-bundle vocabulary (kernel, bundle extension, config tree, Twig extension) is a real cost for a Laravel-native team; budget 1–2 days of onboarding just to read the package, most of it discarded on the re-implementation path.
  • Documentation is 2016-era and Symfony-only; 7.0 adds one line, not a doc pass. Assume 30% accuracy and rely on the code and the corpus.
  • Overall: ~1 sprint for the spike + decision, ~1–2 sprints for adapter, parity harness, and canary, plus ongoing fractional ownership. The dominant risk is not effort — it is the security and dormancy profile of using any of this code in a UGC path without a sanitizer. 7.0 does not change that risk; it only removes a handful of deprecation warnings for a framework we are not running.
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.
mydnic/volet-feature-board-filament-plugin
wmde/email-address
refinery29/test-util
dees040/laravel-api-responses
teamzac/geocoder
ideatica/config-writer
keaton-php/pipe-dream
jacksonwebservices/laravel-user-suite
maksimru/conditional-laravel-debugbar
gismatul/nova-support-chat
gismatul/laravel-support-chat
networkrailbusinesssystems/oracle-api
alphabalex/messaging-made-easy
rawphp/warp
shootkiran/merobug
narakode/fineauth
numencode/wn-syncops-plugin
ibnnajjaar/mib-global-pay
refinery29/php-cs-fixer-config
parsnick/steak