netserva / cms
Professional Laravel CMS with Filament 4 admin panel - standalone deployable
Installs: 6
Dependents: 1
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
pkg:composer/netserva/cms
Requires
- php: ^8.4
- filament/filament: ^4.0
- laravel/framework: ^12.0
- spatie/laravel-medialibrary: ^11.0
- spatie/laravel-sluggable: ^3.6
- spatie/schema-org: ^3.0
Requires (Dev)
- laravel/pint: ^1.13
- pestphp/pest: ^3.0
- pestphp/pest-plugin-laravel: ^3.0
Suggests
- netserva/core: Enables enhanced settings management with database-backed configuration and CRUD UI
README
Professional Laravel 12 + Filament 4 Content Management System
๐ฏ Design Philosophy: Standalone & Deployable Built to work both within NetServa 3.0 AND as a completely standalone Laravel package
โจ Features
Content Management
- ๐ Hierarchical Pages - Nested page structure with multiple templates
- ๐ Blog System - Full-featured blogging with categories and tags
- ๐ท๏ธ Categories & Tags - Organize content with taxonomies
- ๐ Menu Builder - Flexible JSON-based navigation with nested items
- ๐จ Multiple Templates - Homepage, Service, Pricing, Default, and Blank layouts
Media & SEO
- ๐ผ๏ธ Media Library - Spatie Media Library with featured images & galleries
- ๐ SEO Optimized - Meta tags, Open Graph, Twitter Cards built-in
- ๐ Reading Time - Automatic word count and reading time calculation
- ๐ Sluggable URLs - Automatic SEO-friendly URL generation
Admin Experience
- ๐๏ธ Filament 4 Admin - Modern, beautiful admin interface
- โ๏ธ Rich Editor - Full-featured content editing with file attachments
- ๐ Dark Mode - Full dark mode support throughout
- ๐ฑ Responsive - Mobile-first admin panel design
Developer Experience
- โ Zero Dependencies - NO NetServa dependencies, works anywhere
- ๐งช Comprehensive Tests - 70+ Pest tests with 100% coverage goal
- ๐ญ Model Factories - Full factory support for testing
- ๐ฏ Type Safe - PHP 8.4 with full type declarations
- ๐ Soft Deletes - Safe content management
๐ Requirements
- PHP: ^8.4
- Laravel: ^12.0
- Filament: ^4.0
- Spatie Media Library: ^11.0
- Spatie Sluggable: ^3.0
๐ Quick Start
Installation
composer require netserva/cms
Publish Configuration
php artisan vendor:publish --provider="NetServa\Cms\NetServaCmsServiceProvider"
Run Migrations
php artisan migrate
Register Filament Plugin
In your Filament panel provider (app/Providers/Filament/AdminPanelProvider.php):
use NetServa\Cms\NetServaCmsPlugin; public function panel(Panel $panel): Panel { return $panel ->plugins([ NetServaCmsPlugin::make(), ]); }
Access Admin Panel
Visit /admin and start creating content!
๐ Database Schema
All tables use the cms_ prefix to prevent conflicts:
| Table | Purpose |
|---|---|
cms_pages |
Hierarchical page structure with templates |
cms_posts |
Blog posts with word count tracking |
cms_categories |
Multi-type categories (post, portfolio, news, docs) |
cms_tags |
Post tagging system |
cms_post_tag |
Many-to-many pivot table |
cms_menus |
JSON-based navigation menus |
media |
Spatie Media Library tables |
๐๏ธ Architecture
Models (100% Standalone)
All models are completely standalone with ZERO dependencies on NetServa Core:
NetServa\Cms\Models\ โโโ Page // Hierarchical pages with templates & SEO โโโ Post // Blog posts with categories, tags & media โโโ Category // Multi-type categories with type scoping โโโ Tag // Simple tag model with post relationships โโโ Menu // JSON-based menu with hierarchical items
Controllers
NetServa\Cms\Http\Controllers\ โโโ PageController // home(), show(), showNested() โโโ PostController // index(), show(), category(), tag()
Filament Resources
NetServa\Cms\Filament\Resources\ โโโ PageResource // Full CRUD for pages โโโ PostResource // Full CRUD for posts โโโ CategoryResource // Manage categories โโโ TagResource // Manage tags โโโ MenuResource // Menu builder with nested repeaters
Views
resources/views/
โโโ layouts/
โ โโโ app.blade.php // Main layout with SEO & menus
โโโ pages/templates/
โ โโโ default.blade.php // Standard page
โ โโโ homepage.blade.php // Hero, features, CTA
โ โโโ service.blade.php // Service page with sidebar
โ โโโ pricing.blade.php // 3-tier pricing cards
โ โโโ blank.blade.php // Minimal template
โโโ posts/
โโโ index.blade.php // Blog archive with search
โโโ show.blade.php // Single post with related
โโโ category.blade.php // Category archive
โโโ tag.blade.php // Tag archive
๐จ Usage Examples
Creating Pages
use NetServa\Cms\Models\Page; $homepage = Page::factory()->homepage()->create([ 'title' => 'Welcome to My Site', 'content' => '<p>Homepage content...</p>', ]); $about = Page::factory()->create([ 'title' => 'About Us', 'template' => 'default', 'parent_id' => null, ]);
Creating Blog Posts
use NetServa\Cms\Models\Post; use NetServa\Cms\Models\Category; use NetServa\Cms\Models\Tag; $category = Category::factory()->post()->create(['name' => 'Tutorials']); $tags = Tag::factory()->count(3)->create(); $post = Post::factory()->create([ 'title' => 'Getting Started with Laravel', 'content' => '<p>Post content...</p>', ]); $post->categories()->attach($category); $post->tags()->attach($tags);
Building Menus
use NetServa\Cms\Models\Menu; $menu = Menu::factory()->header()->create([ 'name' => 'Main Navigation', 'items' => [ [ 'label' => 'Home', 'url' => '/', 'order' => 0, 'children' => [], ], [ 'label' => 'Services', 'url' => '/services', 'order' => 1, 'children' => [ ['label' => 'Web Development', 'url' => '/services/web'], ['label' => 'Hosting', 'url' => '/services/hosting'], ], ], ], ]);
๐งช Testing
Running Tests
# Run all tests php artisan test # Run specific test file php artisan test packages/netserva-cms/tests/Unit/Models/PageTest.php # Run with coverage php artisan test --coverage
Test Coverage
- Model Tests: 40 tests covering all models
- Controller Tests: 25 tests for PageController & PostController
- Resource Tests: 30+ tests for Filament resources
- Total: 95+ comprehensive tests
Using Factories
use NetServa\Cms\Models\Page; // Create a single page $page = Page::factory()->create(); // Create 10 published pages $pages = Page::factory()->count(10)->published()->create(); // Create a homepage $homepage = Page::factory()->homepage()->create(); // Create nested pages $parent = Page::factory()->create(); $child = Page::factory()->create(['parent_id' => $parent->id]);
โ๏ธ Configuration
Published to config/netserva-cms.php:
return [ 'frontend' => [ 'enabled' => true, ], 'blog' => [ 'route_prefix' => 'blog', 'posts_per_page' => 12, ], 'seo' => [ 'site_name' => env('APP_NAME', 'NetServa CMS'), 'site_description' => 'Professional CMS built on Laravel', ], 'media' => [ 'disk' => 'public', 'max_file_size' => 10240, // KB ], 'templates' => [ 'default' => 'Default Page', 'homepage' => 'Homepage', 'service' => 'Service Page', 'pricing' => 'Pricing Page', 'blank' => 'Blank Page', ], ];
๐ฏ Routes
Frontend Routes
// Homepage GET / // PageController@home // Pages GET /{slug} // PageController@show GET /{parentSlug}/{slug} // PageController@showNested // Blog GET /blog // PostController@index GET /blog/{slug} // PostController@show GET /blog/category/{slug} // PostController@category GET /blog/tag/{slug} // PostController@tag
Admin Routes
All admin routes are handled by Filament at /admin:
/admin/pages- Page management/admin/posts- Post management/admin/categories- Category management/admin/tags- Tag management/admin/menus- Menu builder
๐ Deployment Scenarios
Dual-Purpose Architecture
The netserva-cms package is designed to work in two distinct deployment modes:
1. Integrated Mode (Within NetServa 3.0)
When installed as part of the NetServa 3.0 platform:
Purpose: Provides professional frontend pages for NetServa installations
Routes:
/ โ CMS homepage (NetServa.org branding)
/blog โ Blog posts about NetServa updates
/about โ About NetServa platform
/features โ NetServa features page
/admin โ Filament admin (all NetServa plugins)
/admin/pages โ CMS page management
/admin/vnodes โ Server management (other plugins)
Default Content:
- Homepage: NetServa platform introduction
- About page: Platform explanation
- Features page: Capability overview
- Sample blog post: "Welcome to NetServa 3.0"
Benefits:
- โ Professional landing page for NetServa installations
- โ Explains platform capabilities to visitors
- โ Integrated with other NetServa admin panels
- โ Gets constant updates via NS 3.0 development
2. Standalone Mode (Independent Laravel Project)
When installed in a fresh Laravel 12 project:
Purpose: Power standalone websites (client sites, marketing sites, etc.)
Routes:
/ โ Client homepage
/blog โ Client blog
/{slug} โ Client pages
/admin โ CMS admin panel only
Client Content Examples:
- SpiderWeb website (spiderweb.com.au) โ separate GitHub repo
- Other client marketing sites
- Personal blogs or portfolios
Installation:
# Fresh Laravel 12 project composer create-project laravel/laravel my-client-site cd my-client-site # Install CMS composer require netserva/cms # Configure & migrate php artisan vendor:publish --provider="NetServa\Cms\NetServaCmsServiceProvider" php artisan migrate # Seed with default content OR import client content php artisan db:seed --class="NetServa\Cms\Database\Seeders\NetServaCmsSeeder"
Benefits:
- โ Zero NetServa dependencies
- โ Standalone CMS capabilities
- โ Benefits from NS 3.0 CMS development
- โ Can be customized per client
Content Separation Strategy
Default Content (Included in Repository):
- Professional NetServa.org branding
- General server management messaging
- Suitable for any NetServa installation
Client Content (NOT in Repository):
- SpiderWeb website content โ
spiderweb-websiterepo - Other client sites โ separate repos/projects
- Imported via seeders or manual entry
Why This Separation Matters:
- Repository Cleanliness - No client-specific data in main repo
- Privacy - Client content stays private to client
- Reusability - Same CMS package powers unlimited sites
- Updates - CMS improvements benefit all deployments
Migration Example: SpiderWeb
Current State: WordPress website at spiderweb.com.au
Future Workflow:
# 1. Create separate project git clone <spiderweb-website-repo> cd spiderweb-website # 2. Fresh Laravel + CMS composer create-project laravel/laravel . composer require netserva/cms # 3. Import WordPress content php artisan cms:import:wordpress /path/to/wordpress-export.xml # 4. Deploy separately # (SpiderWeb runs independently of NetServa 3.0)
Result:
- SpiderWeb gets modern Laravel/Filament CMS
- Benefits from NetServa CMS improvements
- Completely separate GitHub repo
- No NetServa platform dependency
Routing Behavior
With CMS Installed:
- CMS owns root
/route - Provides homepage, pages, blog routes
- Fallback to Laravel welcome disabled
Without CMS:
- Root
/shows Laravel welcome page - Only
/adminpanel available - Clean backend-only installation
Environment Configuration:
# Enable/disable CMS frontend CMS_FRONTEND_ENABLED=true # Customize route prefixes CMS_BLOG_PREFIX=blog CMS_PORTFOLIO_PREFIX=portfolio # Admin panel path (security) NS_ADMIN_PREFIX=admin
๐ Design Constraints
โ ALWAYS DO
// โ Implement Plugin directly class NetServaCmsPlugin implements Plugin { } // โ Use own models only namespace NetServa\Cms\Models; // โ Keep composer.json clean "require": { "laravel/framework": "^12.0", "filament/filament": "^4.0" }
โ NEVER DO
// โ Don't extend BaseFilamentPlugin class NetServaCmsPlugin extends BaseFilamentPlugin { } // โ Don't use NetServa Core models use NetServa\Core\Models\VHost; // โ Don't add NetServa dependencies "require": { "netserva/core": "*" }
๐ Verification
Verify zero NetServa dependencies:
# Should return nothing grep -r "NetServa\\Core" packages/netserva-cms/src/ # Should return nothing grep -r "use NetServa" packages/netserva-cms/src/ | grep -v "NetServa\\Cms" # Should show only Laravel/Filament/Spatie packages cat packages/netserva-cms/composer.json | jq '.require'
๐ Complete Directory Structure
packages/netserva-cms/
โโโ composer.json # Zero NS dependencies โ
โโโ config/
โ โโโ netserva-cms.php # Published configuration
โโโ database/
โ โโโ factories/ # Model factories
โ โ โโโ PageFactory.php
โ โ โโโ PostFactory.php
โ โ โโโ CategoryFactory.php
โ โ โโโ TagFactory.php
โ โ โโโ MenuFactory.php
โ โโโ migrations/ # cms_* prefixed tables
โ โโโ 2024_01_01_000001_create_cms_pages_table.php
โ โโโ 2024_01_01_000002_create_cms_categories_table.php
โ โโโ 2024_01_01_000003_create_cms_tags_table.php
โ โโโ 2024_01_01_000004_create_cms_posts_table.php
โ โโโ 2024_01_01_000005_create_cms_post_tag_table.php
โ โโโ 2024_01_01_000006_create_cms_menus_table.php
โ โโโ 2024_01_01_000007_create_media_table.php
โโโ resources/views/
โ โโโ layouts/
โ โ โโโ app.blade.php
โ โโโ pages/templates/
โ โ โโโ default.blade.php
โ โ โโโ homepage.blade.php
โ โ โโโ service.blade.php
โ โ โโโ pricing.blade.php
โ โ โโโ blank.blade.php
โ โโโ posts/
โ โโโ index.blade.php
โ โโโ show.blade.php
โ โโโ category.blade.php
โ โโโ tag.blade.php
โโโ routes/
โ โโโ web.php
โโโ src/
โ โโโ Filament/Resources/
โ โ โโโ PageResource.php # 3 pages (List, Create, Edit)
โ โ โโโ PostResource.php # 3 pages
โ โ โโโ CategoryResource.php # 3 pages
โ โ โโโ TagResource.php # 3 pages
โ โ โโโ MenuResource.php # 3 pages
โ โโโ Http/Controllers/
โ โ โโโ PageController.php
โ โ โโโ PostController.php
โ โโโ Models/
โ โ โโโ Page.php # NO NS relationships โ
โ โ โโโ Post.php # 100% standalone โ
โ โ โโโ Category.php
โ โ โโโ Tag.php
โ โ โโโ Menu.php
โ โโโ NetServaCmsPlugin.php # Implements Plugin โ
โ โโโ NetServaCmsServiceProvider.php
โโโ tests/
โ โโโ Feature/
โ โ โโโ Controllers/
โ โ โ โโโ PageControllerTest.php
โ โ โ โโโ PostControllerTest.php
โ โ โโโ Filament/
โ โ โโโ PageResourceTest.php
โ โ โโโ PostResourceTest.php
โ โ โโโ MenuResourceTest.php
โ โโโ Unit/Models/
โ โโโ PageTest.php
โ โโโ PostTest.php
โ โโโ CategoryTest.php
โ โโโ TagTest.php
โ โโโ MenuTest.php
โโโ DEVELOPMENT_STATUS.md
โโโ README.md
๐ Progress
- โ Package foundation (composer.json, service provider, plugin)
- โ
Database migrations (7 tables with
cms_prefix) - โ Models (5 models, 100% standalone)
- โ Filament resources (5 resources, 17 pages)
- โ Frontend controllers (PageController, PostController)
- โ Blade templates (1 layout, 9 templates)
- โ Model factories (5 factories)
- โ Comprehensive tests (95+ tests)
- โ Documentation (README, DEVELOPMENT_STATUS)
- โณ Run migrations (pending artisan fix)
- โณ SpiderWeb content migration
Status: ~85% Complete
๐ License
MIT
๐ฅ Authors
NetServa Team
๐ค Contributing
This is a NetServa internal package. For issues or feature requests, please contact the NetServa development team.
Built with โค๏ธ using Laravel 12 + Filament 4