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

Audit Kit Bundle Laravel Package

nowo-tech/audit-kit-bundle

A Symfony bundle for adding audit trails to Doctrine entities. It automatically records create, update, and delete events, capturing changed fields, user context, and timestamps so teams can review who changed what and when.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Recommendation: Conditional No-Go for adoption as a dependency — treat as a reference implementation only.

The package solves a genuinely recurring problem (audit columns: createdAt/updatedAt plus createdBy/updatedBy) with a defensible design choice: opt-in per entity rather than global interception. That limits blast radius and makes the change reviewable. Everything else about the package argues against taking it as a runtime dependency.

Architecture fit. The bundle is Symfony + Doctrine ORM, wired as a Symfony bundle with DI extension and Doctrine event subscribers. It is not a Laravel package and has no Eloquent equivalent — the request framing as a "Laravel/PHP package" is a mismatch that must be resolved before any evaluation proceeds. If the target codebase is Laravel, this is a hard stop; the pattern would be reimplemented as a model trait plus observers (or a BelongsToUser-style concern plus a creating/updating hook), which is roughly 100–200 lines. If the target is Symfony/Doctrine, the bundle is directionally appropriate but unproven.

Integration feasibility. Mechanically low effort: register the bundle, enable the mapping/config for selected entities, add four nullable columns plus a migration, and ensure a security token storage is available. The friction is not in the wiring, it is in the semantics — blame fields have no defined value in CLI commands, message consumers, fixtures, and unauthenticated requests, so nullability and downstream reporting must be designed up front.

Technical risk. Dominated by supply-chain and provenance signals rather than code complexity:

  • 1 GitHub star, 0 dependents: no evidence of production use, no community regression signal, effectively a single-maintainer bus factor of one.
  • Release metadata shows a future-dated release (2026-10-25). This is likely a timezone or metadata artifact, but it must be explained before the package is trusted in a build pipeline — an unexplained release date is a legitimate provenance question.
  • No visible evidence of CI matrix coverage across Symfony 7/8 and PHP 8.2+, no stated static-analysis or coverage thresholds.
  • MIT license is permissive and unproblematic.
  • The value delivered is small relative to the trust surface added. A first-party trait plus a Doctrine EventListener/EntityListener is a bounded, well-understood piece of code that the team already owns.

Key questions for the maintainer / spike:

  1. Is the bundle versioned against a stated Symfony/PHP support matrix, and is there a deprecation policy for 8.x/9.x?
  2. How are blame values resolved — constructor-injected TokenStorageInterface with null-safe fallback, or something that throws in CLI context?
  3. Does it handle preUpdate/prePersist only, or also onFlush recomputation for changed-field detection (updatedAt should not churn on no-op updates)?
  4. What is the documented behaviour for bulk DQL/DBAL writes, which bypass lifecycle callbacks entirely?
  5. Are timestamps written in UTC via an injectable clock, or new \DateTimeImmutable() inline (untestable, timezone-dependent)?
  6. What is the test suite size and does it cover the null-actor and embedded/#[Embeddable] cases?
  7. Is there a documented upgrade path, CHANGELOG, and response SLA on issues?

Integration Approach

Stack fit. Only viable where the application is Symfony 7/8 on PHP ≥8.2 with Doctrine ORM and an authenticatable user provider. Where the estate is Laravel/Eloquent, or mixed with raw DBAL/query-builder writes, this package does not fit and should not be forced.

Migration path. Non-destructive if sequenced correctly: the audit columns are additive and nullable, so rollout can be dark. Avoid making them NOT NULL until every write path (including seeders, imports, and async workers) is covered. For legacy rows, backfill with a documented sentinel (system, import) rather than null so that reporting queries stay simple.

Compatibility. Two axes to validate in a spike before commitment: (a) Symfony minor-version drift — bundles frequently break on major upgrades via changed event ordering or DI autoconfiguration; (b) Doctrine ORM 3.x vs 2.x event API differences, which are a common source of silent no-ops. Also verify coexistence with other Doctrine subscribers already in the app (soft-delete, timestampable from other vendors, slug generators) — listener ordering is not guaranteed and duplicate Timestampable behaviour will produce conflicting writes.

Sequencing.

  1. One-day spike in a branch: install, annotate two low-risk entities, run the existing test suite, confirm CLI/fixture behaviour.
  2. Decision gate: if the spike surfaces ordering conflicts, missing test coverage, or a licence/provenance concern, pivot to the in-house implementation.
  3. If adopted: enable on a single internal/admin entity first, observe one release cycle, then expand by allowlist.
  4. Add a schema-drift test that asserts the audit columns exist and are nullable on every opted-in entity, so future entities cannot be silently missed.

Operational Impact

Maintenance. The real cost is not the dependency's code, it is owning an unmaintained transitive surface. With one star and zero dependents there is no realistic expectation of upstream fixes; plan to vendor or fork on day one, which converts "adopt a package" into "own a small internal library with an upstream reference." At that point the honest comparison is: fork-and-own versus write-120-lines, and the latter usually wins on clarity.

Support. No commercial support, no published SLA, no security disclosure process identified. For audit columns specifically — which touch compliance-adjacent data ("who changed this record?") — an unmaintained dependency in the write path is a poor trade. Where the data is used for regulatory or incident forensics, treat this as a compliance-relevant component requiring a named internal owner regardless of who wrote the code.

Scaling. Runtime cost is negligible: one listener invocation per managed entity per flush, negligible against the query cost of the flush itself. The scaling risk is organisational and schema-level — the same columns replicated across many entity managers, multi-tenant schemas, or read replicas, where a single missed migration produces intermittent write failures in production rather than at deploy time.

Failure modes to instrument for:

  • Silent under-auditing. Bulk DQL UPDATE, DBAL, and raw SQL bypass lifecycle callbacks; records mutate with stale audit values. This is the highest-severity failure because it is invisible. Mitigation: route privileged writes through the ORM, and add a periodic reconciliation check.
  • Null blame in non-HTTP contexts. CLI commands, queue workers, and scheduled jobs write createdBy = null; downstream reporting that assumes non-null breaks quietly. Decide the sentinel value before rollout.
  • Listener ordering collisions with existing Doctrine subscribers, producing last-writer-wins on updatedAt.
  • Transaction masking. Exceptions thrown inside prePersist/preUpdate fail the whole flush and surface as opaque errors far from the audit layer.
  • Update churn. Naive preUpdate handlers bump updatedAt on every flush, polluting change-detection and breaking cache-invalidation heuristics keyed on that column.

Ramp-up. Low in absolute terms — half a day for a Symfony engineer familiar with Doctrine events, one to two days for someone who is not, mostly spent on the null-actor and bulk-write edge cases. The documentation surface is small enough to read in full, which is itself a signal: a package this small does not amortise a dependency-management overhead across enough value.

Bottom line: approve only if (a) the estate is confirmed Symfony/Doctrine, (b) the spike passes on the two target entities, (c) an internal owner is named, and (d) the future-dated release is explained. Otherwise adopt the pattern — opt-in audit columns via a first-party subscriber with an injected clock and null-safe actor resolution — and skip the dependency.

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.
tequilarapido/trackit
gregsphotography/site-builder-filament
cabaoctavio/laravel-query-log
gregsphotography/site-builder-components
io-digital/clickatell
snowsoft/laravel-admin
oxygen/auth
relicsoftware/barakah-payment-gateway
tobya/work-with-composer
equipc/laravel-email-validator
equipc/laravel-email-database-log
adedsec/nova-translated-labels
wazza/laravel-db-encryption
hokny/laravel-generator
vonsogt/backup
jengo/queues
jeremykenedy/laravel-observability
coleus/frame
thtg88/journalism
filagora/filagora-ai-forums