aichadigital / lara-content
Content management package for Laravel with pages, posts, blocks and menus. Blade + Livewire, multilingual support.
Fund package maintenance!
:vendor_name
Installs: 3
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 1
pkg:composer/aichadigital/lara-content
Requires
- php: ^8.3
- illuminate/contracts: ^12.0
- league/commonmark: ^2.5
- spatie/laravel-package-tools: ^1.16
- spatie/laravel-translatable: ^6.8
- stevebauman/purify: ^6.2
Requires (Dev)
- larastan/larastan: ^3.0
- laravel/pint: ^1.13
- nunomaduro/collision: ^8.8
- orchestra/testbench: ^10.0
- pestphp/pest: ^4.0
- pestphp/pest-plugin-arch: ^4.0
- pestphp/pest-plugin-laravel: ^4.0
- phpstan/extension-installer: ^1.4
- phpstan/phpstan-deprecation-rules: ^2.0
- phpstan/phpstan-phpunit: ^2.0
Suggests
- livewire/livewire: Required for interactive blocks like ContactForm (^3.0)
This package is auto-updated.
Last update: 2026-01-25 19:17:40 UTC
README
ALPHA VERSION: This package is in early development. The API may change without notice. Not recommended for production use yet.
Content management package for Laravel with pages, posts, blocks and menus. Supports Blade templates with optional Livewire components for interactivity. Includes multilingual support via Spatie Translatable.
Features
- Pages: Flexible page system with customizable layouts and block zones
- Posts: Blog/news posts with author attribution and publishing workflow
- Menus: Hierarchical menu system with nested items
- Blocks: Modular content blocks (HTML, Recent Posts, Menu, Contact Form)
- Layouts: Pre-built page layouts (Single, Sidebar Left/Right, Two/Three Column)
- Multilingual: Full translation support via spatie/laravel-translatable
- Extensible: Register custom layouts and blocks via registries
- Secure: HTML sanitization with configurable allowed tags
Requirements
- PHP 8.3+
- Laravel 12+
- Livewire 3+ (optional, for interactive blocks)
Installation
Install via composer:
composer require aichadigital/lara-content
Publish and run migrations:
php artisan vendor:publish --tag="lara-content-migrations"
php artisan migrate
Publish the config file:
php artisan vendor:publish --tag="lara-content-config"
Optionally publish views for customization:
php artisan vendor:publish --tag="lara-content-views"
Configuration
Key configuration options in config/content.php:
return [ // User ID type: 'auto', 'int', 'uuid', 'ulid' 'user_id_type' => env('CONTENT_USER_ID_TYPE', 'auto'), // Author model for posts 'author_model' => env('CONTENT_AUTHOR_MODEL', 'App\\Models\\User'), // Cache settings 'cache' => [ 'enabled' => env('CONTENT_CACHE_ENABLED', true), 'default_ttl' => env('CONTENT_CACHE_TTL', 3600), ], // Security: allowed HTML tags and attributes 'security' => [ 'allowed_tags' => ['p', 'br', 'strong', 'em', 'a', 'img', ...], 'allowed_attributes' => [...], ], ];
Usage
Pages
Pages support flexible layouts with multiple content zones:
use AichaDigital\LaraContent\Models\Page; // Create a page $page = Page::create([ 'title' => 'About Us', 'slug' => 'about-us', 'layout' => 'sidebar-right', 'status' => 'published', ]); // Add blocks to zones $page->blocks()->create([ 'zone' => 'main', 'block_type' => 'html', 'content' => ['html' => '<p>Welcome to our company...</p>'], 'order' => 1, ]);
Posts
Blog posts with author attribution:
use AichaDigital\LaraContent\Models\Post; $post = Post::create([ 'title' => 'Getting Started', 'slug' => 'getting-started', 'content' => '# Introduction...', 'author_id' => auth()->id(), 'status' => 'published', 'published_at' => now(), ]);
Menus
Hierarchical menus with nested items:
use AichaDigital\LaraContent\Models\Menu; $menu = Menu::create([ 'name' => 'Main Navigation', 'slug' => 'main-nav', ]); $menu->items()->create([ 'title' => 'Home', 'url' => '/', 'order' => 1, ]);
Blocks
Render blocks in your views:
@foreach($page->blocks as $block) {!! app(BlockRenderer::class)->render($block) !!} @endforeach
Available Layouts
| Slug | Name | Zones |
|---|---|---|
single |
Single Column | main |
sidebar-left |
Sidebar Left | main, sidebar |
sidebar-right |
Sidebar Right | main, sidebar |
two-column |
Two Column | left, right |
three-column |
Three Column | left, center, right |
Available Blocks
| Slug | Name | Interactive | Description |
|---|---|---|---|
html |
HTML Block | No | Raw HTML content |
recent-posts |
Recent Posts | No | List of recent posts |
menu |
Menu Block | No | Render a menu |
contact-form |
Contact Form | Yes | Livewire contact form |
Extending
Custom Layouts
Register custom layouts in your service provider:
use AichaDigital\LaraContent\Registries\LayoutRegistry; use App\Content\Layouts\CustomLayout; public function boot(): void { app(LayoutRegistry::class)->register(new CustomLayout()); }
Custom Blocks
Register custom blocks:
use AichaDigital\LaraContent\Registries\BlockRegistry; use App\Content\Blocks\CustomBlock; public function boot(): void { app(BlockRegistry::class)->register(new CustomBlock()); }
Testing
composer test
Changelog
Please see CHANGELOG for recent changes.
License
AGPL-3.0-or-later. See License File for details.
Lara Content (Español)
VERSION ALPHA: Este paquete está en desarrollo inicial. La API puede cambiar sin previo aviso. No recomendado para producción todavía.
Paquete de gestión de contenido para Laravel con páginas, posts, bloques y menús. Soporta plantillas Blade con componentes Livewire opcionales para interactividad. Incluye soporte multilingüe via Spatie Translatable.
Características
- Páginas: Sistema flexible de páginas con layouts personalizables y zonas de bloques
- Posts: Posts de blog/noticias con atribución de autor y flujo de publicación
- Menús: Sistema jerárquico de menús con elementos anidados
- Bloques: Bloques de contenido modulares (HTML, Posts Recientes, Menú, Formulario de Contacto)
- Layouts: Layouts predefinidos (Una Columna, Sidebar Izquierda/Derecha, Dos/Tres Columnas)
- Multilingüe: Soporte completo de traducciones via spatie/laravel-translatable
- Extensible: Registra layouts y bloques personalizados via registries
- Seguro: Sanitización HTML con tags permitidos configurables
Requisitos
- PHP 8.3+
- Laravel 12+
- Livewire 3+ (opcional, para bloques interactivos)
Instalación
Instalar via composer:
composer require aichadigital/lara-content
Publicar y ejecutar migraciones:
php artisan vendor:publish --tag="lara-content-migrations"
php artisan migrate
Publicar archivo de configuración:
php artisan vendor:publish --tag="lara-content-config"
Opcionalmente publicar vistas para personalización:
php artisan vendor:publish --tag="lara-content-views"
Uso
Páginas
use AichaDigital\LaraContent\Models\Page; // Crear una página $page = Page::create([ 'title' => 'Sobre Nosotros', 'slug' => 'sobre-nosotros', 'layout' => 'sidebar-right', 'status' => 'published', ]); // Añadir bloques a zonas $page->blocks()->create([ 'zone' => 'main', 'block_type' => 'html', 'content' => ['html' => '<p>Bienvenido a nuestra empresa...</p>'], 'order' => 1, ]);
Posts
use AichaDigital\LaraContent\Models\Post; $post = Post::create([ 'title' => 'Primeros Pasos', 'slug' => 'primeros-pasos', 'content' => '# Introducción...', 'author_id' => auth()->id(), 'status' => 'published', 'published_at' => now(), ]);
Menús
use AichaDigital\LaraContent\Models\Menu; $menu = Menu::create([ 'name' => 'Navegación Principal', 'slug' => 'nav-principal', ]); $menu->items()->create([ 'title' => 'Inicio', 'url' => '/', 'order' => 1, ]);
Layouts Disponibles
| Slug | Nombre | Zonas |
|---|---|---|
single |
Una Columna | main |
sidebar-left |
Sidebar Izquierda | main, sidebar |
sidebar-right |
Sidebar Derecha | main, sidebar |
two-column |
Dos Columnas | left, right |
three-column |
Tres Columnas | left, center, right |
Bloques Disponibles
| Slug | Nombre | Interactivo | Descripción |
|---|---|---|---|
html |
Bloque HTML | No | Contenido HTML |
recent-posts |
Posts Recientes | No | Lista de posts recientes |
menu |
Bloque Menú | No | Renderiza un menú |
contact-form |
Formulario Contacto | Sí | Formulario Livewire |
Extensión
Layouts Personalizados
use AichaDigital\LaraContent\Registries\LayoutRegistry; use App\Content\Layouts\MiLayout; public function boot(): void { app(LayoutRegistry::class)->register(new MiLayout()); }
Bloques Personalizados
use AichaDigital\LaraContent\Registries\BlockRegistry; use App\Content\Blocks\MiBloque; public function boot(): void { app(BlockRegistry::class)->register(new MiBloque()); }
Tests
composer test
Licencia
AGPL-3.0-or-later. Ver archivo de licencia para detalles.