project-a/acl-bundle
ACL bundle for Project A that adds role- and permission-based access control. Define roles, assign permissions, and protect routes and resources through configuration, with simple checks for authorization throughout your application.
Release review (v1.1.0) — real but immaterial to the decision. Three changes: a bug fix to class permission evaluation, and two conveniences allowing ObjectIdentity instances and class names to be supplied directly rather than constructed by the bundle. All three are Symfony-domain changes. None introduces a Laravel service provider, facade, config surface, or Eloquent integration; none addresses PHP 8, modern Doctrine, or the abandonment of symfony/security-acl. The release also corrects two claims in the prior assessment: the project is not fully archived — there is an active, if very low-cadence, maintainer — and "no upstream fixes" is no longer accurate. That is a genuine improvement in the maintenance picture, and it does not change the recommendation.
Architecture fit — poor, and the framing still needs correcting. project-a/acl-bundle is a Symfony bundle wrapping the Symfony Security ACL component. It does not target Laravel. Any Laravel adoption remains a porting exercise, not an installation exercise.
The underlying platform is the binding constraint, not the wrapper. Symfony's ACL component was deprecated in 3.4 and removed from core in 4.0, surviving only as the separately published symfony/security-acl package, which is itself abandoned. A v1.1.0 release is a maintainer patching a thin convenience layer over a component that no longer exists in supported Symfony versions. The wrapper can be fixed; the foundation cannot.
Integration feasibility — low, unchanged. The package's value is convenience wrappers around ACL primitives: object identities, security identities, mutable ACLs, permission grants. v1.1.0 marginally reduces construction boilerplate for those primitives. In Laravel there is still no host: no security token storage, no ACL provider, no MutableAclProvider in the container. Reproducing them means either bootstrapping a slice of the Symfony security stack inside Laravel, or reimplementing the semantics on Laravel's Gate/Policy system — at which point the package contributes conceptual inspiration only.
Technical risk — severe, though marginally revised.
Key questions before any further work:
spatie/laravel-permission with team scoping or a purpose-built policy layer rather than resurrecting this.Recommendation: reject for new Laravel work. The v1.1.0 release is a credibility improvement for legacy Symfony consumers and should be acknowledged as such — it makes "pin and contain" a slightly safer interim posture. It does not create a Laravel integration path, does not restore the removed platform component, and does not supply the support commitment a production authorization layer requires.
Stack fit — none as delivered. A modern Laravel application (PHP 8.1+, Laravel 10/11) has no compatible insertion point, and v1.1.0 does not change the compatibility surface. The realistic patterns, in descending order of preference:
Migration path (if coming from a legacy ACL system):
acl_classes, acl_object_identities, acl_entries, acl_security_identities) and the actual permission vocabulary, paying particular attention to class-level permissions — the area 1.1.0 touched, which suggests those rows carry known-bad data.model_has_permissions-style table keyed on model type and ID.Compatibility. Still assume failure on PHP 8, modern Doctrine, and modern Symfony components. The 1.1.0 changes are internal API ergonomics, not a compatibility modernization. Forcing installation via replace/provide or constraint aliasing creates a permanently unsupportable branch; do not accept it as "temporary."
Sequencing. (1) Confirm the underlying requirement and rule out a re-expression. (2) If legacy, isolate and pin at v1.1.0 and set a hard exit date. (3) If ACL semantics are truly required, build the Eloquent adapter with tests derived from legacy behavior, including the class-permission edge cases. (4) Shadow-run, reconcile, cut over, decommission.
Maintenance — improved from "you are the sole maintainer" to "you depend on one volunteer." That is a meaningful delta and worth stating plainly: the project has a pulse. But there is no release cadence, no support window, no documented deprecation policy, and a decade-long prior gap. Budget for the probability of abandonment, not just for the current release.
Support — still effectively none. No maintainer SLAs, no forum, no documented troubleshooting. Ramp-up cost remains "read the source," and the real complexity lives in an abandoned framework component no longer covered by current Symfony documentation. Institutional knowledge concentrates in whoever performed the original port — bus factor of one, and the upstream maintainer is a second single point of failure outside your organization.
Scaling — the classic ACL bottleneck, unchanged. ACL storage grows with the product of objects, security identities, and permission entries. Naive per-object checks produce query-per-object behavior on list screens, historically where ACL implementations fall over. Mitigations — batch preloading, decision caching, denormalized effective permissions — are custom work you own. An RBAC/permission-table design typically resolves list-view authorization with one indexed join or a cached role lookup.
Failure modes to design against:
composer update or PHP minor upgrade renders the app unbuildable. Mitigate with a vendored lock, isolated container, or don't ship it.Ramp-up. Days, not hours, for an experienced engineer to understand the wrapper and its host component; weeks for the surrounding ACL semantics plus a safe port. v1.1.0 trims a little boilerplate but adds no documentation. Factor a second engineer to remove the single-person dependency.
Bottom line for the roadmap: still a migration-away item, not a build-on item. The recommendation is unchanged and slightly better supported. v1.1.0 shows the wrapper is maintained by a responsive individual, which is worth acknowledging to the business — it makes legacy pinning defensible in the near term. It does not make this a Laravel package, does not restore the removed Symfony ACL component, and does not provide the support commitment a production authorization layer requires. If a business case for granular ACL genuinely exists, fund a maintained implementation; if it does not, close the request and point to Laravel's native authorization stack.
How can I help you explore Laravel packages today?