Looking to hire Laravel developers? Try LaraJobs

laravel-page-versioning maintained by anjan-talukdar

Description
A lightweight, append-only content management and versioning engine for Laravel applications with optional Filament Admin support.
Author
Anjan Talukdar
Last update
2026/07/30 09:47 (dev-main)
License
Links
Downloads
1

Comments
comments powered by Disqus

Laravel Page & Page Versioning Engine (anjan-talukdar/laravel-page-versioning)

Latest Version on Packagist Software License

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_code is an integer (1, 2, 3...) automatically calculated by the system without requiring user input.
  • Viewer-Facing Version Name: version_name stores 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:

  1. Publish Filament Resource Files for Overwrite:

    php artisan vendor:publish --tag=page-versioning-filament
    

    This copies PageResource.php, sub-pages, and PageVersionsRelationManager directly into app/Filament/Resources/PageVersioning for complete editing.

  2. Override Resource Class via Plugin Method:

    PageVersioningPlugin::make()
        ->resource(App\Filament\Resources\CustomPageResource::class)
    
  3. 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.php
  • resources/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.php
  • resources/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.