symfonycontrib/link-button-bundle
A Symfony bundle for rendering link-style buttons in your applications. It offers reusable helpers and template integration so anchors can be presented as buttons with minimal setup, keeping navigation actions consistent and easy to maintain.
What it is. symfonycontrib/link-button-bundle is a Symfony bundle whose single purpose is to render a form submit button as an anchor-style link, so secondary actions like "Cancel" navigate rather than submit. Functionally it is a form type/helper wrapper that emits an <a> tag with the form-appropriate markup and target URL. It is not a Laravel package; the request frames this as Laravel/PHP, and that mismatch is the first evaluation finding.
Architecture fit. The bundle is a Symfony 2-era design: it assumes the Symfony bundle system (AppKernel registration, DI extension, templating helpers). It has no Laravel service provider, facade, Blade directive, or config publishing, so it cannot be dropped into a Laravel app without a compatibility shim that would be larger than the feature itself. Even inside a Symfony context, the underlying capability is a one-line Twig/Blade concern — an anchor styled as a button — that most teams already express inline. There is no architectural gap this package uniquely closes.
Integration feasibility. Near zero on a modern stack. Symfony 2 bundles of this vintage typically depend on symfony/symfony ~2.x, symfony/form ~2.x, and twig/twig 1.x. Current Symfony (6/7) and Laravel (10/11) will refuse to resolve those constraints, and even with --ignore-platform-reqs the form helper and templating APIs have changed materially (form themes, ChoiceType/ButtonType, Twig namespacing). Treat it as not installable rather than installable-with-effort.
Technical risk. High, concentrated and asymmetrical: the risk is not that the package breaks, it is that adopting it buys nothing while importing a permanent liability.
Key questions.
Recommendation. Do not adopt. Reimplement in-application: in Laravel, a Blade component or <x-link-button> partial; in Symfony, a form theme block or a small custom ButtonType extension. Estimated effort: half a day, including tests.
Stack fit. Poor to nonexistent as a dependency; good as a pattern to copy. The concept — a styled anchor that sits in a form's action row — is worth standardizing. The package is not the vehicle for that standardization on Laravel, and only marginally on legacy Symfony 2.
Migration path. Recommended path is pattern extraction, not package installation:
href, label, variant, confirm, preserveScroll. Document that it renders an <a> and therefore never submits, never runs validation, and never persists.data-confirm-discard attribute wired to the app's dialog, not to the library.If a legacy Symfony 2 application genuinely cannot be touched: read the bundle source (it is small), copy the relevant form type and template into the application's own bundle or src/Form namespace, and add the license header. That converts a dependency into owned code and eliminates the supply-chain and abandonment risk in one step.
Compatibility. Assume Symfony 2.x / PHP 5.x era constraints until proven otherwise by running composer require against the target lock file. Any Laravel integration would require writing a service provider, a Blade directive, and a facade — three artifacts to reproduce two lines of HTML — which fails the cost/benefit test outright.
Sequencing. This is an independent, low-coupling change and should be scheduled as a small cleanup ticket, not a migration epic: (1) confirm the requirement is presentation-only; (2) build the local component; (3) replace ad-hoc anchor markup across forms; (4) delete any exploratory composer require attempt from the branch. Do not put it on the critical path of a framework upgrade.
Maintenance. Adopting the package converts an in-house one-file component into a third-party dependency with no maintainer. That inverts the normal cost curve: you would be paying maintenance on someone else's behalf, with no ability to request a fix. The local component, by contrast, is a few dozen lines that any developer on the pod can amend in the same PR as the feature that needs it.
Support. No commercial support, no issue-response expectation, no security disclosure process. When a future PHP or Symfony release breaks it, the remediation is "fork and patch" — which is the same work as writing it from scratch, minus the sunk time. Under an incident, that is the worst possible place to be: an unowned dependency in the checkout flow of a form.
Scaling. Effectively unconstrained — the component is stateless markup and has no runtime cost — but also unscalable in the organizational sense. Every team that needs a "Cancel" link either forks it, wraps it, or ignores it and writes anchors inline, producing three divergent patterns and an inconsistent UI. Centralizing on one internal component is what actually scales here.
Failure modes.
symfony/form or twig/twig and stall a framework upgrade. This is the classic abandoned-package failure and it lands on someone else's roadmap.composer.lock protects you only until someone runs composer update.role/keyboard semantics considered; a stale template is unlikely to have been audited against current WCAG expectations.Ramp-up. Trivial either way — the feature is simple enough that a new hire understands it in five minutes. The relevant ramp-up cost is organizational: introducing an unfamiliar, unmaintained bundle requires explanation to every reviewer and every future maintainer ("why is this here?"), whereas a local component in the shared UI directory is self-documenting and discoverable. Prefer the option that a new team member can find, read, and change without asking permission.
Bottom line. The package's intent is sound and its scope is honest, but it is unmaintained, has no adoption, targets a framework generation we are not on, and cannot serve a Laravel codebase. Reimplement the pattern locally, standardize the cancel/confirm semantics alongside it, and keep the dependency graph clean. Rate the underlying need as real; rate the package as a no-go.
How can I help you explore Laravel packages today?