laravel-page-versioning maintained by anjan-talukdar
Laravel Page & Page Versioning Engine (anjan-talukdar/laravel-page-versioning)
A lightweight, append-only content management and versioning engine for Laravel applications with optional Filament Admin support.
Maintains complete revision history for static pages (e.g. Privacy Policy, Terms of Service, Cookie Policy, Refund Policy, About Us, Contact) with draft/publish workflows, soft deletes, and safe rollbacks.
Key Features
- Append-Only History: Edits and rollbacks duplicate revisions as brand-new versions without ever overwriting historical records.
- Auto-Increment Revision Code:
version_codeis an integer (1,2,3...) automatically calculated by the system without requiring user input. - Viewer-Facing Version Name:
version_namestores human-friendly version strings (e.g.v1.0.0,v1.1.0,Initial Release). - Dual Support: Fully functional out-of-the-box in standard Laravel applications (without Filament) or inside Filament Admin dashboards via
PageVersioningPlugin. - Application Status Enum: Type-safe version status management (
DRAFT,PUBLISHED,ARCHIVED). - Flexible URL Routing: Supports direct short URLs (
/pages/privacy-policy) and optional type-prepended URLs (/pages/legal/privacy-policy). - Automatic Custom Blade Resolution: Create custom per-slug or per-type views effortlessly.
- Blade Helpers: Retrieve published page instances or contents in Blade using
page('privacy-policy'). - Centralized Service: All business logic encapsulated in
PageService.
Installation
1. Require Package via Composer
composer require anjan-talukdar/laravel-page-versioning
2. Install Base Package
Run the standard installation command to publish configuration and database migrations:
php artisan page-versioning:install
Filament Admin Integration (Optional)
If your application uses Filament Admin, run the dedicated Filament installation command:
php artisan page-versioning:install-filament
Then register the PageVersioningPlugin in your panel provider (e.g. app/Providers/Filament/AdminPanelProvider.php):
use AnjanTalukdar\PageVersioning\Filament\PageVersioningPlugin;
public function panel(Panel $panel): Panel
{
return $panel
// ...
->plugins([
PageVersioningPlugin::make()
->navigationGroup('Content Management')
->navigationIcon('heroicon-o-document-duplicate')
->navigationSort(10),
]);
}
Customizing Filament Resources
Developers can customize the Filament resources in 3 ways:
-
Publish Filament Resource Files for Overwrite:
php artisan vendor:publish --tag=page-versioning-filamentThis copies
PageResource.php, sub-pages, andPageVersionsRelationManagerdirectly intoapp/Filament/Resources/PageVersioningfor complete editing. -
Override Resource Class via Plugin Method:
PageVersioningPlugin::make() ->resource(App\Filament\Resources\CustomPageResource::class) -
Override Resource Class via Config (
config/page-versioning.php):'filament' => [ 'resources' => [ 'page' => App\Filament\Resources\CustomPageResource::class, ], ],
Custom Blade Views & Templates
Developers can customize page Blade views in 3 flexible ways:
1. Page-Specific / Slug-Specific View Overrides (Automatic Resolution)
Create a Blade view matching the page slug in your host application's resources/views/pages/:
resources/views/pages/about-us.blade.phpresources/views/pages/privacy-policy.blade.php
The package automatically detects and renders these custom files whenever that page slug is accessed!
2. Category / Type-Specific View Overrides
Create a Blade view matching the page category type:
resources/views/pages/legal.blade.phpresources/views/pages/general.blade.php
3. Publish Global Package View for Overwriting
Publish the default Blade template to resources/views/vendor/anjan-talukdar/laravel-page-versioning/show.blade.php:
php artisan vendor:publish --tag=page-versioning-views
Usage Guide
Using Blade Helper (Without Filament)
You can retrieve active published pages directly in any custom Blade view:
@if($policy = page('privacy-policy'))
<h1>{{ $policy->currentVersion->title }}</h1>
<div>{!! $policy->currentVersion->content !!}</div>
<small>Version: {{ $policy->currentVersion->version_name }} (Rev #{{ $policy->currentVersion->version_code }})</small>
@endif
Programmatic Usage via PageService
use AnjanTalukdar\PageVersioning\Services\PageService;
use AnjanTalukdar\PageVersioning\Enums\PageVersionStatus;
$service = app(PageService::class);
// 1. Create a logical page with initial version (version_code auto-set to 1)
$page = $service->createPage([
'type' => 'legal',
'slug' => 'privacy-policy',
], [
'title' => 'Privacy Policy',
'version_name' => 'v1.0.0', // Viewer version label
'content' => '<p>Privacy policy content...</p>',
], $userId = null, $publishImmediately = true);
// 2. Draft a new revision (version_code auto-incremented to 2)
$draftVersion = $service->createVersion($page, [
'title' => 'Privacy Policy (2027 Update)',
'version_name' => 'v1.1.0',
'content' => '<p>Updated privacy policy content...</p>',
'change_summary' => 'Updated data protection compliance terms',
], PageVersionStatus::DRAFT);
// 3. Publish a revision
$service->publishVersion($page, $draftVersion);
// 4. Safe Rollback to a past version (version_code auto-incremented to 3)
$service->rollbackToVersion($page, $oldVersion, 'Rollback to Initial Release');
Configuration (config/page-versioning.php)
return [
'register_routes' => true,
'route_prefix' => 'pages',
'route_middleware' => ['web'],
'layout' => 'public.layouts.app',
'default_types' => [
'legal' => 'Legal & Policies',
'general' => 'General Information',
],
];
License
The MIT License (MIT). Please see License File for more information.