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

Illuminate Contao Laravel Package

mpociot/illuminate-contao

Bridges Laravel's Illuminate components with Contao CMS, making database, container, events, and related APIs available inside Contao. Use familiar Laravel-style patterns and Eloquent workflows without leaving your Contao project.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. This is an interop shim, not a framework package, and its fit is decided almost entirely by two boundaries: whose service container wins and whose event dispatcher wins. Contao 4 already runs a Symfony container (System::getContainer()) and a Symfony dispatcher; the bridge adds an Illuminate container and an Illuminate dispatcher beside them. Two registries of truth for the same application are survivable only if the split is explicit and written down — Illuminate resolves new application code, Contao resolves framework and extension code, and nothing crosses back. If the bridge auto-wires Contao services into the Illuminate container (or the reverse), "where is this bound?" acquires two correct answers, and that ambiguity is the most expensive thing to unwind later. Fit is therefore conditional and narrow: strong for a team with Laravel gravity modernizing a Contao 4.x estate in place; disqualified for greenfield and for anything load-bearing.

Integration feasibility. Cheap to test, and every check is go/no-go. A TPM should fund half a day, not a sprint, to answer: which Contao major is actually supported (3.x's custom autoloader and system/modules layout make it effectively unusable there; 4.4–4.9 versus 4.13+/5.x is unstated), which PHP and illuminate/* constraints the composer.json declares, whether the bridge self-registers or expects a manual call from a bundle bootstrap, and what it actually wires. There is no documentation and no changelog, so the source is the specification — a fact the team must price into the estimate rather than discover mid-sprint.

Technical risk. The risk profile is dominated by maturity, not complexity. One tag (0.1.0), no release notes, no semver promise, zero dependents, zero star signal, evaluation score 0.3. That means: a caret range is an uncontrolled upgrade path; each bump must be reviewed by hand against the diff; the resolved Illuminate version may lag current Laravel enough that familiar Collection/Str/query-builder helpers are absent; and there is no upstream support expectation whatsoever. Secondary but real technical risks: two PDO connections to one database cannot see each other's uncommitted work, so mixing Database::getInstance() and the builder inside a single unit of work deadlocks or silently misreads; hooks registered through both Contao and the bridge fire twice; a cached container ignores new bindings after registration changes; serialized tl_ columns come back as raw strings. Finally, the supplied technical assessment reads generically and does not engage Contao's lifecycle specifics — documentation quality should be a scored criterion in the decision, not a footnote.

Key questions a TPM should force answers to before funding anything.

  • What Contao and PHP versions are declared, and do they match our install? This gate kills the most adoption attempts and must be checked first.
  • Does the bridge self-register inside the Contao lifecycle, or do we own the bootstrap call in every site?
  • How many lines of glue is it, really? Under roughly 300 lines of container wiring means in-house ownership wins on every axis except time-to-first-commit.
  • Who is the named owner, and what is the written fork-or-reimplement trigger?
  • Does this satisfy a portfolio-level need (one integration pattern across N properties) or a single-site convenience? Those are different funding decisions.
  • Is the licence compatible with policy, and is the package still maintained at all?

Integration Approach

Stack fit. Contao 4 with Composer and a PSR-4 autoloader is the only viable host; confirm that before anything else. The practical fit test is dependency resolution: read vendor/mpociot/illuminate-contao/composer.json and check the illuminate/* and PHP constraints against what is already installed. If the bridge pins an Illuminate major that collides with an existing package, the integration cost jumps from days to indeterminate — that is a stop condition, not a puzzle to solve.

Migration path. Strangler pattern, one seam at a time. First use case: take a single hand-written \Database::getInstance()->prepare(...)->execute(...) read in code we own, re-express it as a fluent query, and wrap the result in an Illuminate\Support\Collection. That is small, reversible, and exercises the two things we most need to trust — connection configuration and query building. From there: business logic as constructor-injected classes resolved from the Illuminate container; Eloquent models against tl_ tables with $table, $primaryKey, and $timestamps = false set explicitly (Contao does not follow Laravel conventions); Contao hooks shimmed into Illuminate events so listeners are testable classes rather than global functions.

Compatibility. Put the bridge behind a thin interface (Db, Events) so Illuminate concrete types never spread across the codebase — with zero dependents, that boundary doubles as the removal plan and is the single highest-leverage design decision in the whole integration. Keep Contao's native Database for anything the CMS manages (DCA-driven CRUD, migrations, framework internals) and use the builder for reporting, non-trivial joins, and pagination. Pick exactly one connection per transaction and never mix. Register each hook once, in one place. Clear Contao's cache after any container change. Run query-builder tests against in-memory SQLite so the suite does not require a Contao install.

Sequencing. Five gates, each with a timebox and a written exit criterion:

  1. Day 0 — compatibility gate. Declared Contao/PHP/Illuminate constraints versus our install; licence check. Fail here and the evaluation stops.
  2. Day 1 — install and inspect. Exact pin (composer require mpociot/illuminate-contao:0.1.0, never ^0.1), read composer.json, read src/, determine registration mechanism, count the glue.
  3. Day 2 — smoke test. Behind a feature flag, on one non-critical property or module: resolve a service from the container, dispatch a trivial event, run one query-builder statement against an existing tl_ table.
  4. Day 3 — decision memo. Adopt-and-own, fork, or reimplement. Reimplement is a legitimate outcome, not a failure.
  5. Post-decision — standards. If adopted: exact pin recorded, owner named, bump-review procedure documented, dual-container rule written into the ADR, and a revisit trigger defined (second release with notes and an upgrade path).

Operational Impact

Maintenance. With zero dependents and no release notes, we are the de facto maintainer from the first commit. That is a staffing commitment disguised as a dependency. Operationally it means: exact-version pinning (a caret range is an uncontrolled upgrade), a reviewed diff plus re-run of the smoke test on every bump, and keeping the source vendorable so a fork is a mechanical step rather than a project. Budget owner attention explicitly — an afternoon to read the source up front, then recurring review time each release, which may be zero for long stretches and is therefore easy to under-resource.

Support. Community-only, no SLA, no vendor. This is the disqualifier for any revenue-critical checkout, regulated data, or surface with an uptime commitment, and it should be recorded in the risk register as an accepted risk rather than left implicit. For a marketing site, an internal tool, or a single property, a pinned occasionally-upgraded dependency is a tolerable posture.

Scaling. Two distinct scale questions. Across properties: the genuine portfolio win is one integration pattern across N Contao sites instead of N bespoke agency-era patterns — a shared vocabulary for test seams and data access, plus access to the much deeper Laravel labor pool. But that is an argument for standardizing on the convention, not on this 0.1.0 release; do not make a pre-1.0, single-maintainer library a portfolio standard. Within an application: long-running workers expose the dual-container lifetime mismatch — Symfony services leaking into Illuminate singletons produce stale state, and each type must be resolved from exactly one container.

Failure modes to plan for.

  • Transaction collision: two PDO connections in one unit of work deadlock or silently misread. Mitigation: single connection per transaction, enforced by the adapter boundary.
  • Double dispatch: the same hook registered through Contao and the bridge fires listeners twice. Mitigation: one registration point, asserted in a test.
  • Stale container cache: new bindings silently ignored after a registration change; engineers debug the wrong layer for hours. Mitigation: cache clear as a documented step.
  • Illuminate version drift: a resolved component lacks helpers the team assumes exist. Mitigation: check vendor/illuminate/* before using anything beyond the basics.
  • Abandonment: upstream stops responding to anything, including security-relevant issues. Mitigation: pre-agreed fork-or-reimplement trigger, chosen before an incident rather than during one.
  • Debugging opacity: mitigated cheaply with Capsule::connection()->enableQueryLog() for the data layer and binding dumps for the DI layer.

Ramp-up. A Laravel-fluent engineer reads the source in an afternoon and is productive in days; a Contao-native developer without Illuminate exposure is measurably slower, because the win is familiarity and they do not yet have it. That asymmetry is worth naming in the staffing plan: the package widens who can contribute to the codebase, but only after the first Illuminate-literate hire or contractor is in place. Expect three engineer-days to reach an adopt/fork/reimplement decision on one non-critical property behind a feature flag — a small, bounded spend that produces a written answer to a roadmap question ("migrate off Contao, or modernize in place?") that would otherwise cost an order of magnitude more to resolve.

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.
jinas/dhivatar
store-doc/laravel-storage-driver
plus-it/laravel-translation-manager
diephp/perhaps
diephp/telegraph
osmaviation/spreadsheet
microsoft/fluentui-system-icons
mmccook/php-json-canonicalization-scheme
middlewares/firewall
qubiqx/montapacking
nyoncode/laravel-package-console
pnscripts/filament-broadquill-lite
pnscripts/laravel-sentfold-lite
vleap/mx-sdk-laravel-internal
twidpay/utils
htetmyathlaing/scout-elasticsearch-driver
artisan-toolbox/front-awesome
ls/client-assistant
users-au/laravel-client
cgv/localized-resource