gorg/ldaporm-bundle
A Symfony bundle that integrates LDAP ORM into your application, providing configuration and service wiring for mapping LDAP directory entries to PHP objects. Query and manage LDAP-backed data with familiar object-oriented models.
Architecture fit: mismatched on two axes — framework and runtime. The package is a Symfony 2 bundle (EOL since November 2018, PHP 5.x–7.0 target), not a Laravel package. The value it demonstrates — mapping LDAP directory entries to PHP objects behind a Doctrine-style entity manager and fluent query builder — is a sound pattern, but the shipped artifact is bound to Symfony's bundle/DI/annotation machinery and cannot be dropped into a Laravel container. Treat this as a design reference, not a dependency candidate. The framework-alignment decision it forces (directory layer framework-agnostic vs. container-coupled) is the real deliverable of this evaluation, and it is expensive to reverse later.
Integration feasibility: low without a fork; the fork is not worth it. There is no service provider, no publishable config, no facade, and no Eloquent/Query Builder bridge. A Laravel bridge would require porting container wiring, replacing Doctrine annotations (deprecated since Annotations 1.13, superseded by PHP 8 attributes) with attributes or array config, and isolating Symfony event-dispatcher coupling — i.e., a re-implementation. With 10 stars and 0 dependents, we would be the first production consumer with no community-tested path to copy.
Technical risk register.
| Risk | Severity | TPM implication |
|---|---|---|
License NOASSERTION |
Blocker | Unresolvable SPDX identifier. Legal sign-off required before any code — including copy-paste — enters the repo. Assume incompatible until proven otherwise. |
| Symfony 2 / PHP 5–7 runtime | High | Cannot coexist with Laravel 10+/PHP 8.1+. This is a language-runtime gap, not a Composer constraint tweak. |
| Single maintainer, 0 dependents, score 0.26 | High | No security response path for code handling credentials and TLS. We own every future CVE. |
| Annotation-based mapping | Medium | Rewrite required regardless of framework choice. |
| LDAP correctness surface | Medium | Paged results, referrals, SASL, StartTLS, filter escaping — unverifiable without a source audit; rarely rigorous at this project size. |
| Framework-alignment debt | High | If we adopt anything container-coupled now, portability to Laravel/Symfony/CLI workers is repaid later at 10x. |
Key questions to close before any build/buy/borrow decision.
composer.json PHP and symfony/* constraints — confirms the runtime gap rather than assuming it.ext-ldap directly or delegate to symfony/ldap? The latter might be separately salvageable.Recommendation to the product org: score 0.26 is the correct signal. Close the adopt-as-dependency path; retain the package as a written rationale and a pattern reference. Budget for a maintained substitute or a thin internal adapter behind a stable interface.
Stack fit: substitute, don't port. For Laravel the pragmatic equivalent is directorytree/ldaprecord + directorytree/ldaprecord-laravel — Eloquent-like models over LDAP, a real service provider, publishable config, PHP 8 attributes, and active maintenance. It satisfies the same conceptual need (directory entries as models with finders and relationships) on a supported runtime. For a Symfony application, use the native Symfony Ldap component. Neither is a like-for-like port of Gorg; both are lower-total-cost replacements.
Migration path (where LDAP modeling already exists in our codebase).
DirectoryRepository (findByDn, search, bind) and route all callers through it, so the backend is swappable and this decision never has to be relitigated at the call-site level.Compatibility: zero for Laravel 10+. Confirmed blockers, in order of hardness: PHP version floor, Symfony 2 component constraints, annotation metadata driver, absence of a Laravel provider. There is no "install and alias" path; any framing of this as a quick integration should be corrected in the plan of record.
Sequencing (four-week gate structure).
composer.json inspection, LDAP wrapper and filter-escaping review. No engineering spend before this closes.Maintenance. Adopting this package means owning it outright. One maintainer, 10 stars, zero dependents: no PHP 8.3/8.4 compatibility work, no CVE response, no fixes as LDAP tooling evolves. Every future PHP or framework upgrade becomes our patch — a recurring headcount line, not a one-time integration cost. Against LdapRecord, that burden is amortized across a user base.
Support. No commercial support, no reliable issue triage, no meaningful documentation site. The practical cost is source archaeology: engineers must read the code to learn hydration semantics because no spec exists. Budget two to three days per engineer before the first meaningful change, and require a named owner for "who patches this in 18 months" before any adoption decision — an unowned dependency handling credentials is an audit finding waiting to happen.
Scaling. ext-ldap has no connection pooling; every request performs a fresh bind. That constraint is inherited by any PHP LDAP package, so the ORM's overhead sits on top of an already latency-bound operation. Watch specifically for: per-request bind storms under load, ldap_search result-size limits silently truncating (the classic 1000-entry Active Directory default), paged-results cookie handling under concurrent workers, and PHP-FPM worker exhaustion when directory latency exceeds request lifecycle expectations.
Failure modes to instrument from day one. These are the ones that produce silent correctness bugs rather than clean errors:
max_execution_time; a hung directory can take down the worker pool.Ramp-up. Assume two to three weeks to productivity for a mid-level engineer, dominated by directory schema knowledge — object classes, attribute semantics, DN construction, AD vs. OpenLDAP divergence — not by package familiarity. That knowledge transfers cleanly to LdapRecord or the Symfony component; the Gorg-specific knowledge does not, and should not be budgeted as an asset.
Roadmap bottom line. The license alone disqualifies the package pending legal resolution, and the Symfony 2 runtime makes integration cost exceed a rewrite. Recommend closing the evaluation with a written rationale, recording the framework-agnostic directory-layer decision as the durable output, and substituting directorytree/ldaprecord-laravel — reserving a narrow fork only for a capability a spike proves unique and necessary.
How can I help you explore Laravel packages today?