Weave Code
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

Laravel Versionable Laravel Package

overtrue/laravel-versionable

Add lightweight version history to Laravel Eloquent models. Track only changed attributes, control fields via whitelist/blacklist, keep a set number of versions, browse versions and revert to any saved point in time with simple APIs and migrations.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture Fit

  • Versioning Pattern: The package implements a temporal versioning pattern (snapshot/diff-based) for Eloquent models, aligning well with Laravel’s ORM-first architecture. It avoids complex event-driven solutions (e.g., event sourcing) while providing auditability and rollback capabilities.
  • Separation of Concerns: Version history is stored in a dedicated versions table (configurable), decoupling versioning logic from business models. This adheres to Laravel’s convention of "one model per table."
  • Flexibility: Supports both whitelist (explicit attributes) and blacklist (exclude attributes) strategies, accommodating varying compliance/performance needs (e.g., GDPR vs. high-write throughput).
  • Strategy Patterns:
    • DIFF (default): Stores only changed attributes (space-efficient, ideal for large datasets).
    • SNAPSHOT: Stores full attribute copies (simpler queries, useful for complex objects).
  • Diffing Engine: Leverages jfcherng/php-diff for human-readable deltas, enabling UX features like side-by-side comparisons in admin panels (e.g., Filament integration).

Integration Feasibility

  • Laravel Ecosystem Fit: Designed for Laravel 9+ (PHP 8.1+), with explicit support for Laravel 12/13. Compatible with:
    • Eloquent models (standard and custom).
    • Database connections (supports multi-tenancy via connection hints).
    • Soft deletes (via isForceDeleting() checks).
  • Minimal Boilerplate: Requires only:
    1. Trait import (use Versionable).
    2. Attribute whitelist/blacklist definition ($versionable or $dontVersionable).
    3. Migration publish (php artisan vendor:publish).
  • Customization Points:
    • Version model class ($versionModel).
    • Version strategy ($versionStrategy).
    • Diff rendering formats (HTML, JSON, text).
  • Performance Considerations:
    • Write Overhead: Each save() triggers a version check (configurable via withoutVersion()).
    • Read Overhead: Lazy-loads versions (avoids N+1 queries with with('versions')).
    • Storage: Diff strategy reduces version table bloat but may complicate queries (e.g., filtering by attribute values).

Technical Risk

Risk Area Severity Mitigation
Version Table Bloat Medium Use DIFF strategy; limit retained versions via config ($keepVersions).
Query Complexity Low Avoid deep version queries in high-traffic endpoints; use eagerLoad().
Diff Accuracy Low Test edge cases (e.g., nested arrays, JSON fields) with stripTags option.
Migration Conflicts Low Publish migrations early; use --force cautiously.
Laravel Version Lock Medium Pin to ^5.5 for stability; monitor Laravel 13+ compatibility.
Concurrency Issues Low Use database transactions for critical revert operations.
Custom Model Inheritance Low Extend \Overtrue\LaravelVersionable\Version for custom logic.

Key Questions for TPM

  1. Use Case Prioritization:
    • Is versioning needed for audit trails, user rollbacks, or collaboration (e.g., CMS)?
    • Should versions be immutable (append-only) or mutable (editable)?
  2. Performance Tradeoffs:
    • Can the team tolerate the ~20–50% write overhead for versioning?
    • Is the diff strategy acceptable for query performance (e.g., filtering by versioned attributes)?
  3. Data Retention:
    • How many versions should be kept ($keepVersions)? Auto-purge old versions?
  4. UX Requirements:
    • Are visual diffs (HTML/inline) needed for admin panels (e.g., Filament)?
    • Should reverts be atomic (single query) or manual (step-by-step)?
  5. Testing Strategy:
    • How to test versioning logic? Mock Versionable trait or use a dedicated test model?
    • Validate diff accuracy for edge cases (e.g., timestamps, relationships).
  6. Deployment Risks:
    • Can migrations be run in production without downtime?
    • How to handle existing data if adopting versioning mid-project?

Integration Approach

Stack Fit

  • Laravel Core: Native Eloquent integration; no framework modifications required.
  • Database: Supports MySQL, PostgreSQL, SQLite (via Laravel’s query builder).
  • Testing: Compatible with PHPUnit/Pest; includes built-in FeatureTest examples.
  • Admin Panels:
    • Filament: Official filament-versionable integration.
    • Nova: Requires custom development (e.g., tool integration).
  • APIs:
    • REST: Return version metadata in responses (e.g., X-Version-ID header).
    • GraphQL: Use Laravel GraphQL’s field resolvers to expose versions.

Migration Path

  1. Pre-Integration:
    • Audit models requiring versioning (prioritize high-impact entities like Post, UserProfile).
    • Design version retention policy (e.g., "keep 10 versions per model").
  2. Implementation:
    • Phase 1: Add trait to 1–2 models; test locally.
      composer require overtrue/laravel-versionable
      php artisan vendor:publish --provider="Overtrue\LaravelVersionable\ServiceProvider"
      php artisan migrate
      
    • Phase 2: Implement whitelist/blacklist; configure strategy (DIFF or SNAPSHOT).
    • Phase 3: Add revert/diff endpoints (e.g., /posts/{id}/versions/{version}/revert).
  3. Post-Integration:
    • Backfill existing data (if needed) via data migrations.
    • Add versioning to remaining models incrementally.

Compatibility

Component Compatibility Notes
Eloquent Models ✅ Full support Works with standard and custom models.
Relationships ⚠️ Limited Versioning does not track relationships (e.g., belongsTo).
Observers/Events ✅ Supported Triggers saving/saved events; can hook into reverting.
Scopes ✅ Supported Respects global/local scopes (e.g., SoftDeletes).
API Resources ✅ Manual Extend JsonResource to include version metadata.
Queues/Jobs ✅ Supported Versioning works in queued jobs (no async-specific logic).
Caching ⚠️ Caution Required Avoid caching versioned models; use Cache::forever() sparingly.
Replication ✅ Supported Version tables replicate like any other table.

Sequencing

  1. Critical Path:
    • Publish migrations → Run migrations → Add trait to models → Test version creation.
  2. Non-Blocking:
    • Implement diff endpoints (low priority if not needed for UX).
    • Add Filament/Nova integrations (post-MVP).
  3. Deprecation:
    • Phase out manual audit logs if versioning replaces them.

Operational Impact

Maintenance

  • Configuration Drift: Centralize versioning settings (e.g., $keepVersions, $versionStrategy) in a config file or environment variables.
  • Schema Changes: Monitor for Laravel/Eloquent breaking changes (e.g., new attributesToArray() method in v5.2.4).
  • Dependency Updates: Pin to ^5.5 for stability; test upgrades against Laravel minor versions.
  • Logging: Log version operations (e.g., revert, removeVersion) for debugging:
    \Log::info('Reverted model', ['model' => $model->class, 'version' => $versionId]);
    

Support

  • Common Issues:
    • Missing Versions: Verify $versionable attributes; check withoutVersion() blocks.
    • Diff Errors: Test with stripTags: true for HTML content.
    • Performance: Optimize queries with with('versions') or loadMissing('versions').
  • Debugging Tools:
    • Use tinker to inspect versions:
      $post = Post::find
      
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.
codifyo/ts-generator-bundle
andydefer/laravel-cluster
testo/fiber
mintobit/jobqueue
a4sex/maintenance-bundle
a4sex/entity-date-update
a4sex/client-identifier
a4sex/base-utilites
a4sex/key-value-storage
a4sex/micro-status
chilldev/dependency-injection-extra
datinglibre/datinglibre-app-api
biberltd/corebundle
bricre/symfony-bundle-test
biberltd/logbundle
dominium/http-adapter-bundle
dominium/google-analytics
a4sex/auto-clean-entity
christhompsontldr/laravel-inky
spatie/mailcoach-vapor