grazulex / laravel-draftable
Add drafts, versioning, and publication workflow to any Eloquent model โ ideal for content editing, previews, and rollback.
Fund package maintenance!
Grazulex
Buy Me A Coffee
paypal.me/strauven
Requires
- php: ^8.3
- illuminate/support: ^11.0|^12.0
Requires (Dev)
- doctrine/dbal: ^4.2
- larastan/larastan: ^3.4
- laravel/pint: ^1.22
- orchestra/testbench: ^9.0|^10.0
- pestphp/pest: ^3.8
- pestphp/pest-plugin-laravel: ^3.2
- rector/rector: ^2.0
This package is auto-updated.
Last update: 2025-08-08 03:57:11 UTC
README

Production-ready drafts, versioning, and publication flow for any Eloquent model
A comprehensive package for managing content lifecycle with enterprise-grade quality
๐ Overview
Laravel Draftable is a production-ready package that adds comprehensive drafts, versioning, and publication workflows to any Eloquent model in Laravel. Perfect for content management systems, blog platforms, documentation sites, e-commerce products, and any application where you need reliable content lifecycle management with version control capabilities.
โจ Key Features
- ๐ Draft System - Save changes without publishing immediately
- ๐ Version History - Complete tracking of all changes over time
- ๐ Version Comparison - Detailed diff analysis between any versions
- โช Version Restoration - Restore to any previous version instantly
- ๐ Flexible Publishing - Manual or automatic publication workflows
- ๐๏ธ Storage Strategies - Same table or separate drafts table support
- ๐๏ธ Draft Preview - Preview changes without making them live
- ๐ Access Control - Full Laravel policies integration
- ๐ Performance Optimized - Optimized database queries and indexes
- ๐จ Artisan Commands - Complete CLI management suite
- ๐งช Test Coverage - 128/128 tests passing with 93.6% coverage
- โก Events System - Laravel events for draft lifecycle
- ๐ก๏ธ Production Ready - Zero static analysis errors (PHPStan level 5)
๏ฟฝ Installation
Install the package via Composer:
composer require grazulex/laravel-draftable
๐ก Auto-Discovery: The service provider will be automatically registered thanks to Laravel's package auto-discovery.
โก Quick Start
use Grazulex\LaravelDraftable\Traits\HasDrafts; // Add to your model class Post extends Model { use HasDrafts; protected $fillable = ['title', 'content', 'status']; } // Create and manage drafts $post = Post::create(['title' => 'My First Post']); // Make changes and save as draft $post->title = 'Updated Title'; $post->content = 'Draft content here...'; $post->saveDraft(); // Publish when ready $post->publishDraft(); // View version history $versions = $post->drafts; // Compare versions using the service $draftDiff = app(\Grazulex\LaravelDraftable\Services\DraftDiff::class); $diff = $draftDiff->compare($version1, $version2); // Restore previous version $post->restoreVersion(2);
๐ง Requirements
- PHP 8.2+
- Laravel 11.0+
๏ฟฝ Complete Documentation
For comprehensive documentation, examples, and advanced usage guides, visit our Wiki:
๐ ๐ Laravel Draftable Wiki
The wiki includes:
- ๐ Home
- ๐ Getting Started Guide
- ๐ง Installation & Configuration
- ๐ฏ Core Concepts
- ๐ก Examples & Use Cases
- ๐จ Artisan Commands
- ๐ API Reference
- ๐ Changelog
๐จ Artisan Commands
Laravel Draftable includes powerful CLI commands for draft management:
# List all drafts with filtering options php artisan draftable:list --model=Post --unpublished --limit=20 # Compare two specific versions of a model php artisan draftable:diff Post 1 1 2 --format=json # Clean up old drafts with safety checks php artisan draftable:clear-old --days=30 --dry-run
๐ Advanced Features
Version Comparison
use Grazulex\LaravelDraftable\Services\DraftDiff; $draftDiff = app(DraftDiff::class); $differences = $draftDiff->compare($draft1, $draft2); // Example output: [ 'title' => [ 'type' => 'modified', 'old' => 'Original Title', 'new' => 'Updated Title' ], 'content' => [ 'type' => 'added', 'old' => null, 'new' => 'New content here' ] ]
Events Integration
use Grazulex\LaravelDraftable\Events\{DraftCreated, DraftPublished, VersionRestored}; // Listen for draft events Event::listen(DraftCreated::class, function ($event) { // Handle draft creation }); Event::listen(DraftPublished::class, function ($event) { // Handle draft publication }); Event::listen(VersionRestored::class, function ($event) { // Handle version restoration });
Database Migration
The package includes an optimized migration:
Schema::create('drafts', function (Blueprint $table) { $table->id(); $table->morphs('draftable'); $table->json('payload'); $table->unsignedBigInteger('version')->default(1); $table->foreignId('created_by')->nullable()->constrained('users'); $table->timestamp('published_at')->nullable(); $table->timestamps(); // Performance indexes $table->index(['draftable_type', 'draftable_id']); $table->index('published_at'); $table->index('version'); });
๐ Quality Metrics
Laravel Draftable maintains exceptional quality standards:
- โ 128/128 tests passing (100% success rate)
- โ 93.6% code coverage (enterprise grade)
- โ PHPStan level 5 (zero static analysis errors)
- โ PSR-12 compliant (Laravel Pint)
- โ SOLID principles (clean architecture)
- โ Production ready (zero known issues)
๐ฏ Use Cases
Perfect for:
- Content Management Systems - Blog posts, articles, pages
- E-commerce Platforms - Product descriptions, specifications
- Documentation Sites - Version-controlled documentation
- Marketing Campaigns - Draft and schedule content releases
- User-Generated Content - Moderation workflows with drafts
- API Content - Versioned API documentation and responses
๐ฎ Roadmap
Future enhancements planned:
- ๐ Webhook Integration - HTTP notifications on publish events
- ๐ฏ Git-style Delta Storage - Space-efficient version storage
- ๐ Approval Workflows - Multi-step moderation processes
- ๐ฑ API Endpoints - RESTful API for external integrations
- ๐ Multi-language Support - Internationalization features
๐ค Contributing
Please see CONTRIBUTING.md for details.
๐ Security
If you discover any security-related issues, please email jms@grazulex.be instead of using the issue tracker.
๐ Changelog
Please see RELEASES.md for more information on what has changed recently.
๐ License
The MIT License (MIT). Please see License File for more information.
๐ฅ Credits
๐ฌ Support
- ๐ Report Issues
- ๐ฌ Discussions
- ๐ Documentation
for any Eloquent model with enterprise-grade quality.
Built with โค๏ธ following SOLID principles and clean code practices.