incompass/injection-bundle
A dependency-injection bundle for PHP that centralizes service registration and container configuration, reducing boilerplate and making it easier to wire, replace, and test application components.
Architecture fit — disqualifying for a Laravel estate. The package is misfiled. incompass/injection-bundle is a Symfony bundle, built for Symfony's kernel/bundle lifecycle: a Bundle class registered in config/bundles.php, a DI extension, compiler passes that rewrite service definitions during container compilation, and cache warmup. Laravel has none of those extension points. It has service providers, a deferred container, and reflection-based auto-resolution in Illuminate\Container\Container. There is no adapter that loads a Symfony bundle into a Laravel application. Making this work in Laravel means porting its annotation-scanning and definition-rewriting logic into a service provider — a rewrite of the package, not an integration of it.
Integration feasibility — low, and the upside is near-zero even if the port succeeded. The capability on offer (declarative injection targets instead of hand-written service definitions) is already native in Laravel: constructor injection is resolved automatically, contextual binding is a provider one-liner, and interfaces are bound with $this->app->bind(). A ported version would duplicate framework behavior with a bespoke convention, add reflection cost at boot, and produce a DI style no Laravel developer on the team would recognize. There is no gap in our stack for this to fill.
Technical risk — high, and concentrated in provenance rather than in code we can read. Zero stars, zero dependents, no release history, no downloads, single obscure vendor (Incompass, a CRM vendor, not a DI tooling maintainer). A dependency injection extension touches every service in the container, so its blast radius is the entire application while its marginal benefit is a small syntactic convenience. Specific exposures:
doctrine/annotations — itself in maintenance mode — plus reflection-scanning surface of its own.#[Autowire], #[Required], #[TaggedIterator], #[AsDecorator]), and autowiring/autoconfigure has been core since 3.3.Key questions to close before spending another hour on it:
composer.lock-pinned transitive dependency on deprecated doctrine/annotations?Stack fit — no direct fit; the correct integration is none. For Laravel, the substitute is the framework we already run: constructor injection via the container, bind/singleton/contextual binding in AppServiceProvider, and interface-to-implementation maps. For Symfony 4+, the substitute is native autowiring plus PHP 8 attributes. In both cases the "annotation-driven wiring" intent is satisfied by core, type-safe, IDE-navigable features.
Migration path — substitute, do not adopt. If this is encountered while porting an Incompass-based Symfony service, map each annotation to its modern equivalent rather than carrying the bundle forward:
@Inject on a property → constructor type-hint, resolved by autowiring / the Laravel container.calls in service config, or constructor injection where possible.#[TaggedIterator] (Symfony) or tagged bindings in a service provider (Laravel).Budget this as a small refactor inside the port, not as a dependency decision. It is cheaper than adopting, pinning, and self-maintaining a fork.
Compatibility — unverified and probably blocking. There is no published compatibility matrix, so the only way to answer the question is a throwaway spike against a scratch skeleton on the pinned PHP version. Expect it to fail on modern Symfony and to be meaningless on Laravel. Do not schedule dependent work behind it.
Sequencing, if a spike is ever approved (legacy Symfony only):
doctrine/annotations.Maintenance — a standing cost with no upstream. Zero dependents and zero stars means effectively unmaintained code that we now own. Every PHP minor bump, Symfony major, and container change becomes our team's problem. This belongs in the estimate as a recurring line item, not a one-time adoption cost.
Support — none. No issue-tracker activity, no maintainer SLA, no community forum, no documentation beyond a one-line description. Internal engineers become de facto maintainers, and knowledge concentrates in whoever ran the spike — a single point of failure for on-call.
Scaling — reflection is not free. Annotation/attribute scanning adds container build time and memory. That is tolerable at warmup with a compiled container but amplifies on cold starts, queue workers, and high-fanout or serverless deployments that bootstrap per request. Benchmark container build time before and after; the delta is the real price of the abstraction.
Failure modes to instrument:
Ramp-up — negative. No docs, no examples, no community corpus. Ramp-up is entirely internal knowledge transfer, and it produces a skill that does not transfer to the next project. Compare against native container features every hire already knows.
Recommendation: reject. Out of scope for Laravel (incompatible by construction), obsolete in design for modern Symfony, and carrying unquantified supply-chain risk with zero community signal. Close the evaluation, do not POC, do not procure. If the dependency is found in inherited code, log it as technical debt, scope replacement into the next major version, and contain rather than expand it in the interim.
How can I help you explore Laravel packages today?