skyfox/propel-bundle
Symfony bundle that integrates the Propel ORM, letting you define models in schema files, generate PHP classes, and query data through Propel's fluent API, with configuration, service wiring, and console tooling built into the Symfony framework.
Package identity mismatch (first-order issue). skyfox/propel-bundle is a Symfony2 bundle, not a Laravel package. It wires the Propel 2 ORM into the Symfony full-stack framework via a Bundle class, a DI extension, a configuration tree (propel:), console commands (propel:build, propel:model:build, propel:migration:*), and a data-collector for the Symfony profiler. None of those seams exist in Laravel. The bundle is therefore not installable into a Laravel application in any supported way — Composer will pull symfony/symfony-era component constraints that conflict with illuminate/*, and even if resolved with --ignore-platform-reqs, there is no kernel to register the bundle with.
What is actually reusable. Propel itself (propel/propel) is framework-agnostic: a runtime (Propel\Runtime\Propel), a connection manager driven by a config array/php file, generated ActiveRecord + Query classes, and a CLI for schema/migration/codegen. The only durable asset in this package is a reference implementation of "how to configure and drive Propel from a framework container." In a Laravel context that is roughly 300–600 lines of glue we would own ourselves, not a dependency.
Architecture fit: poor. Propel's model is generated-code-first (schema XML → base classes → concrete subclasses you edit), which is philosophically opposed to Eloquent's hand-written, convention-over-configuration Active Record. Adopting it means: a codegen step in the build pipeline, generated artifacts in version control, a dual-class hierarchy (Base* / *), and a query API (ModelQuery, Criteria) that no Laravel developer on the team knows. That is a permanent tax on every onboarding.
Integration feasibility: low as-is, moderate if re-scoped.
| Integration vector | Feasible with this package | Realistic alternative |
|---|---|---|
composer require skyfox/propel-bundle in Laravel |
No — Symfony kernel/bundle + version conflicts | — |
| Use Propel ORM alongside Eloquent | No — bundle is the blocker, not Propel | propel/propel + custom ServiceProvider |
| Symfony 2/3 legacy app | Yes, in principle — but pinned to EOL Symfony/PHP | Fork and patch, or full port |
| Schema/migration tooling | Not reusable | Propel CLI invoked from a Laravel command |
Technical risk: high, concentrated in abandonment. 7 stars, 0 dependents, last release 2022-10-16, single-org fork of an upstream bundle that was effectively retired when Symfony moved past the bundle era. There is no security-response process, no PHP 8.x/8.3/8.4 certification, and no path to a CVE fix except "we patch our fork." For a system of record (an ORM sees every query and every credential in databases.php), that is an unacceptable supply-chain posture unless the code is vendored into our repo and owned by a named engineer.
Key questions before any decision:
schema.xml + generated models we must preserve? A Symfony2 app being ported to Laravel? Or a perceived performance need? Only the first two justify considering Propel at all; if it's performance, this is the wrong tool and the wrong conversation.propel/propel 2.x satisfy them?propel/propel-bundle?Verdict: Treat the 2.03 score as accurate. This is a reference implementation to read, not a dependency to ship.
Stack fit. There is no direct fit. Laravel's extension surface is service providers, facades, and Illuminate\Database connections; Propel expects to own the PDO handle, the transaction stack, and its own connection manager singleton. Bridging them means deciding, explicitly, that Propel owns the connection and Eloquent does not — mixing both against the same tables in one request is a correctness hazard (two transaction contexts, two identity maps, no shared dirty-state).
Recommended path: do not integrate the bundle; integrate the ORM (and only if Q1 justifies it).
app/Propel/ as reference. Extract the array shape it produces for Propel::setConfiguration().propel/propel directly. Add propel/propel (and propel/propel-bundle only as reading material) to a spike branch; confirm PHP 8.x compatibility with a real schema, not a smoke test.PropelServiceProvider. Load config/propel.php, call Propel::init() in register(), and — critically — bind connection setup to boot()/terminating() rather than a long-lived static, so Octane and queue workers do not inherit stale handles.Base* classes are build artifacts: a php artisan propel:build command wrapping the Propel CLI, run in CI, committed under app/Propel/Models/, autoloaded via a PSR-4 namespace. Never generate at runtime.App\Repositories\*; controllers and jobs depend on interfaces. This is the single most important decision — it caps the blast radius if we later revert to Eloquent.Migration path (if porting off a Symfony2 app). Extract schema.xml and the bundle's propel: config block → regenerate models against the target PHP version → stand up the Laravel PropelServiceProvider → port console commands (propel:migration:diff etc.) to Artisan wrappers → run both frameworks against a shared schema in staging to diff query results → cut traffic over per-endpoint. Sequence the cutover per bounded context, not per layer; a half-ported context with two ORMs on one table set is the most likely way this project fails.
Compatibility. Expect hard Composer conflicts: the bundle's symfony/* constraints predate Symfony 5, while Laravel 9+ pins Symfony components to 6.x. illuminate/support and the bundle cannot co-resolve. Propel core is the only piece with a plausible path to modern PHP, and even that requires verification against 8.2/8.3 before any commitment.
Sequencing. (1) Answer Q1 — driver and target stack. (2) Two-day spike: Propel core + one real table + one repository + one Octane request loop. (3) Only on a clean spike, size the codegen/CI work. Do not sequence the bundle installation at all.
Maintenance. Effectively zero upstream. Last release 2022, one organization, 7 stars. Any defect we hit is ours to fix. Budget a standing 10–20% of one engineer for ORM-glue upkeep, PHP-version bumps, and security triage — forever, or until the Propel footprint is retired. Compare against Eloquent, whose maintenance cost is amortized across the framework we already pay for.
Support. No community, no issue traffic, no Stack Overflow corpus of consequence. Debugging is source-reading. Propel's own documentation is thin and dated; the bundle's is thinner. Institutional knowledge will live in one or two heads.
Scaling. Propel's runtime performance is not the concern — it is competitive with Doctrine for read-heavy workloads and its generated Query classes are reasonably fast. The concerns are:
Propel::getConnection() returns a process-wide singleton. Connections and open transactions survive across requests. This is the highest-probability production incident and must be handled with an explicit per-request reset in middleware/terminating callbacks, verified under load.DB:: metrics will under-report actual PDO usage. Capacity planning must read the DB's own connection stats.preventLazyLoading guardrails and Telescope-style visibility by default. Expect to build query logging ourselves.Failure modes, ranked:
Base* classes overwritten by hand edits, producing behavior that diverges from the schema.Ramp-up. Steep and non-transferable. A Laravel developer is productive in Eloquent on day one; Propel requires learning the schema-XML workflow, the Base*/concrete class split, the Query/Criteria API, and the migration commands — call it 2–3 weeks to competent, 2–3 months to fluent, per engineer. That is a recurring cost on every future hire and directly reduces the pool of candidates who can be productive in this codebase.
Bottom line. Adopt only if a Propel schema is a non-negotiable business constraint — and even then, take propel/propel with an in-house service provider and a repository boundary, leaving this bundle as documentation. If the requirement is merely "we're a PHP shop considering alternatives," decline: the score, the star count, the dependents, and the 2022 release date all point the same direction.
How can I help you explore Laravel packages today?