mlo/console-bundle
mlo/console-bundle is a Laravel/PHP package that provides a lightweight console bundle for structuring and registering custom commands. It helps organize command logic, simplify CLI workflows, and integrate cleanly with existing Laravel applications.
Architecture fit. Unchanged, and now more sharply defined. v2.0.0 is still a Symfony Bundle, and the release notes confirm it: "Update the bundle for Symfony 5." Nothing in the release adds Laravel-facing integration points. The package remains a first-class citizen of Symfony's FrameworkBundle kernel lifecycle — registered via bundles.php, participating in container compilation passes, depending on symfony/http-kernel and symfony/dependency-injection in their framework-wired form. Laravel ships selected Symfony components but deliberately does not ship FrameworkBundle or the kernel-container compilation model. Its container is Illuminate\Container\Container, bootstrapped by Illuminate\Foundation\Application. A Symfony Bundle cannot be registered with that bootstrap without standing up a second kernel alongside Laravel's, which remains unsupported and unsane. The release tightening Symfony coupling (dropping 4.x, targeting 5.x) moves it further from Laravel, not closer.
Integration feasibility. Low to none — identical conclusion, updated reasoning.
symfony/framework-bundle and a hosting kernel. v2.0.0 no longer even accepts Symfony 4, so the only viable host is a Symfony 5 application. For a Laravel target this is a non-starter. Rejected, now more firmly.Application::getBindings(), getLoadedProviders(), resolved(), and getAliases(). We would be using it as a design reference, not leveraging it.php artisan tinker, php artisan about, route:list, event:list, app()->make(), plus Telescope and Debugbar for runtime visibility.The most notable change is a new naming collision. v2.0.0 renames the command from console to tinker. In a Laravel shop, tinker is a loaded word — it is Laravel's own first-party REPL (laravel/tinker, shipped by default). A Symfony bundle command now sharing that name is actively confusing in exactly the environment this request is scoped to. A developer encountering tinker in a mixed dependency graph will reasonably assume it is Laravel's. That is a documentation and onboarding hazard the v1 package did not have.
Technical risk. The dominant risk is still opportunity cost and false signal, but the risk profile has shifted in two directions at once.
composer update.Key questions.
require-dev candidate there and the only wrong part of the original framing was "Laravel." If no, the release is inert for us.tinker rename, how do we prevent confusion with Laravel's first-party php artisan tinker in mixed-estate documentation and onboarding material?Stack fit. Still not applicable to a Laravel application. The correct integration approach for a Laravel-only team remains do not integrate. For a polyglot estate with Symfony 5 services, v2.0.0 is a require-dev for those services only and must never enter a Laravel application's composer.json. The tinker command name is a specific reason to keep it out of Laravel-adjacent tooling and docs.
Migration path. Recommended sequence, unchanged in ordering:
app:container:show {service?}) wrapping getBindings(), getAliases(), getLoadedProviders(), and resolved(), guarded by $this->laravel->environment(['local','development']). Small, testable, owned, version-proof. If a spike against v2.0.0 happens, use its output shape as a spec reference — and deliberately do not copy the tinker name.php artisan tinker for ad-hoc app()->make() probing. Closes the large majority of the need with zero new dependencies.require-dev, pin it, and record it in the dependency inventory as single-maintainer with a revisit date. Any v1 consumer gets a scheduled upgrade ticket covering the Symfony floor bump and the console→tinker rename, including updates to CI scripts and runbooks.Compatibility. Sharpened by this release. v2.0.0 requires Symfony 5+; v1 is now the frozen branch for Symfony 4. Laravel compatibility remains a non-question — no Laravel support is declared and no Laravel-facing integration points exist. Before adopting in a Symfony service, confirm the service is on Symfony 5 (not 6/7 — the package does not claim those) and that PHP constraints resolve. A package that only supports Symfony 5 is itself a short-lived choice, since that host will need to move to 6.4/7.x on its own timeline.
Sequencing. Still not on a delivery critical path. Changes: (a) if a Symfony 5 consumer exists, the v1→v2 upgrade should be scheduled as routine maintenance with the rename included in the change record; (b) any new spike against v2.0.0 remains timeboxed (≤1 day), throwaway-branch, output-is-a-written-comparison, never in a shipped composer.json; (c) the Laravel decision gate is unchanged — does the internal Artisan command cover the need? It will. Close the ticket.
Maintenance. Marginally improved and still poor. A 2025-era release implies the maintainer is alive and willing to accept a PHP/Symfony bump, which reduces near-term breakage probability. But it does not create a support contract: no release cadence, no published deprecation policy, likely still one maintainer. For a Laravel audience the number is unchanged and effectively infinite — every PHP upgrade and every dependency drift is ours, for a tool that was never meant for this stack. For a Symfony 5 audience the burden is real but bounded, and it now comes with a known expiry: Symfony 5 itself is at or near end-of-life, so the package has no forward path to 6.4/7.x unless the maintainer ships again. That is a scheduled deprecation risk, not a hypothetical one.
Support. No material change. No maintainer SLA, no issue triage guarantee, no security contact. Internal developers encountering a failure escalate to the platform team, who have no upstream. Add a new and specific support cost this release creates: the tinker rename will generate "is this the same tinker as php artisan tinker?" questions in any estate running both, and that confusion will be attributed to the platform team's dependency choices.
Scaling. Unchanged on the technical axis — developer tooling, not on the request path. On the organizational axis, the negative training value is now slightly worse: developers who learn this command learn a tinker that is not Laravel's tinker. That is a naming collision with the platform's most familiar first-party tool. The one scaling risk that genuinely matters remains exposure: any derivative command reachable outside local/dev can expose container definitions and environment-bound parameters.
Failure modes. Updated, roughly in order of likelihood:
console break on tinker. Silent CI failure or a confusing "command does not exist" in a runbook.tinker is Laravel's and are surprised by Symfony-shaped output, or vice versa.Kernel to register with — producing a boot-time error in a Laravel app.php artisan list, and developers conclude the tool is broken rather than inapplicable.Ramp-up. Near-zero for a Symfony 5 developer; slightly worse than before because the rename invalidates existing muscle memory and documentation. For a Laravel team it remains negative: the cost is unlearning the assumption that container introspection works the Symfony way, now compounded by a command name that deliberately echoes Laravel's own REPL. The valuable artifact is still the idea — one discoverable command answering "what is bound, what is resolved, who provides it." v2.0.0 makes the package a marginally more credible reference for a Symfony shop and does nothing to change its suitability for ours; it is worth an afternoon of internal Laravel engineering and still roughly nothing as a third-party dependency at this signal level.
How can I help you explore Laravel packages today?