artisanpack-ui / cms-framework
Adds in the back end support for building a CMS with any front end framework.
Requires
- php: ^8.2
- artisanpack-ui/accessibility: ^2.1.0
- artisanpack-ui/core: ^1.0
- artisanpack-ui/hooks: ^1.1
- artisanpack-ui/rbac: ^1.0
- artisanpack-ui/security: ^1.0.3|^2.0
- dedoc/scramble: ^0.12 || ^0.13
- illuminate/support: ^12.17.0
- justinrainbow/json-schema: ^6.0
- laravel/framework: ^12.0
- laravel/sanctum: ^4.0.8
- laravel/tinker: ^2.10.1
Requires (Dev)
- artisanpack-ui/code-style: ^1.1
- artisanpack-ui/code-style-pint: ^1.1
- dealerdirect/phpcodesniffer-composer-installer: ^1.0
- fakerphp/faker: ^1.23
- friendsofphp/php-cs-fixer: ^3.75
- laravel/pail: ^1.2.2
- laravel/pint: ^1.26
- laravel/sail: ^1.41
- mockery/mockery: ^1.6
- nunomaduro/collision: ^8.6
- orchestra/testbench: ^10.2
- pestphp/pest: ^3.8
- pestphp/pest-plugin-laravel: ^3.2
- squizlabs/php_codesniffer: 3.11.3
This package is auto-updated.
Last update: 2026-06-02 20:16:35 UTC
README
A comprehensive Laravel package that provides back-end support for building a CMS with any front-end framework. This package offers a complete set of features for content management, user management, authentication, and more.
Features
- Content Management: Content types, taxonomies, and media management
- Admin Interface: Admin pages, dashboard widgets, and settings management
- User Management: User roles, permissions, and profiles (powered by
artisanpack-ui/rbacin 2.0.0) - Authentication: Two-factor authentication with Laravel Sanctum integration
- Notifications: Comprehensive notification system
- Site Editor (new in 2.0.0): WordPress-style templates, template parts, patterns, global styles, and menus
- Visual Editor Integration (new in 2.0.0): Opt-in bridge to the optional
artisanpack-ui/visual-editorpackage - Blog Comments (new in 2.1.0): Threaded post comments with public read / guest submit, rate-limited public submission, and auth-gated moderation
- Themes: Discovery, activation, ZIP upload, and lifecycle hooks
- Plugins: Plugin system ⚠️ Experimental
- Core Updates: Automatic update checking and management with rollback support
- PWA Support: Progressive Web App features
- Audit Logging: Track changes and user actions
Requirements
- PHP 8.2 or higher
- Laravel 12.0 or higher
- Laravel Sanctum 4.1 or higher
Quick Installation
You can install the CMS Framework package by running the following composer command:
composer require artisanpack-ui/cms-framework
After installation, publish the configuration file:
php artisan vendor:publish --tag=cms-framework-config
Run the migrations to set up the database tables:
php artisan migrate
Documentation
- Installation Guide - Detailed installation and setup instructions
- Configuration - Configuration options and environment setup
- Usage Guide - Comprehensive usage examples and tutorials
- API Documentation - Complete REST API reference
- Migration Guide - Migrating from other CMS frameworks
- Testing - Testing strategies and examples
- Performance & Troubleshooting - Optimization and common issues
- Contributing - Development and contribution guidelines
Quick Start
Content Types
Register a custom content type:
use ArtisanPackUI\CMSFramework\Features\ContentTypes\ContentTypeManager; app(ContentTypeManager::class)->register('product', [ 'name' => 'Product', 'plural' => 'Products', 'description' => 'Products for the store', 'supports' => ['title', 'editor', 'thumbnail'], ]);
Admin Pages
Register a custom admin page:
use ArtisanPackUI\CMSFramework\Features\AdminPages\AdminPagesManager; app(AdminPagesManager::class)->addPage([ 'title' => 'Custom Settings', 'slug' => 'custom-settings', 'callback' => function() { return view('custom.settings'); } ]);
Settings
Register and retrieve settings:
use ArtisanPackUI\CMSFramework\Features\Settings\SettingsManager; // Register a setting app(SettingsManager::class)->register('site_name', 'My Awesome Site'); // Get a setting $siteName = app(SettingsManager::class)->get('site_name');
Customization with Hooks
The CMS Framework uses hooks and filters for extensive customization:
// addFilter and addAction are global helper functions provided by the framework // Add a filter addFilter('ap.cms.migrations.directories', function($directories) { $directories[] = __DIR__ . '/database/migrations'; return $directories; }); // Add an action addAction('ap.cms.after_content_save', function($content) { // Do something after content is saved });
Experimental Features
The following features are experimental in the 1.0.0 release and should be used with caution in production environments:
Plugin System
The plugin system provides a foundation for extending the CMS with custom functionality.
What Works:
- Plugin model with activation/deactivation tracking
- Plugin manager for lifecycle management
- Plugin installation and validation
- Plugin update manager integration
Known Limitations:
- Plugin lifecycle hooks not fully implemented
- No plugin dependency management
- Limited plugin configuration API
- No plugin marketplace integration
Recommendation: Use for testing and development. Not recommended for production until full lifecycle support is added in a future release.
Theme System
The theme system allows customization of the CMS appearance.
What Works:
- Theme manager with theme discovery
- Theme activation mechanism
- JSON manifest validation
- Basic theme structure
- Lifecycle hooks for install/activate (see below)
Known Limitations:
- Asset compilation not implemented
- No child theme support
- Limited theme customization API
- No theme preview functionality
Theme Lifecycle Hooks
The Themes module fires doAction() callbacks around installFromZip() and activateTheme() so host applications can subscribe listeners (seed content, register theme-supplied service providers, etc.) without forking the framework.
| Hook | Fires | Payload | Throwing semantics |
|---|---|---|---|
theme.installing |
After the ZIP is extracted and the manifest is validated, before the install is finalized. | string $slug, array $manifest |
Throwing aborts the install; the extracted directory is rolled back. |
theme.installed |
After the install completes and the discovery cache is cleared. | string $slug, array $manifest |
Throwing propagates to the caller (install is already complete). |
theme.activating |
After the target theme is resolved, before themes.activeTheme is updated. |
string $slug, array $manifest |
Throwing aborts activation; the active theme setting is not changed. |
theme.activated |
After themes.activeTheme is updated and cache invalidation is attempted (including view:clear, which is logged-and-continued on failure). |
string $slug, array $manifest |
Throwing propagates to the caller (activation is already complete). |
addAction('theme.activated', function (string $slug, array $manifest): void { // Seed pages, register navigation entries, etc. });
Recommendation: Use for testing and development. Full theme support including asset compilation and child themes will be added in a future release.
Reporting Issues
If you encounter issues with experimental features, please report them on our issue tracker with the experimental label.
Contributing
We welcome contributions! Please see Contributing Guide for details on:
- Development setup
- Code style guidelines
- Testing requirements
- Submission process
Security
If you discover a security vulnerability, please send an email to security@artisanpack.com. All security vulnerabilities will be promptly addressed.
Credits
License
The MIT License (MIT). Please see License File for more information.
Changelog
Please see CHANGELOG.md for more information on what has changed recently.