appdezign/lara-pro-cms
Lara Pro CMS 10 is a flexible content management system built on Laravel by Firmaq Media. Designed for building and managing websites with a developer-friendly approach. Full developer guide and documentation available at docs.laracms.nl.
Installation:
composer require appdezign/lara-pro-cms
Run the publisher to configure the package:
php artisan vendor:publish --provider="Appdezign\LaraProCms\LaraProCmsServiceProvider" --tag="config"
php artisan vendor:publish --provider="Appdezign\LaraProCms\LaraProCmsServiceProvider" --tag="migrations"
Run migrations:
php artisan migrate
First Use Case:
Create a basic content type (e.g., Article) via the Filament admin panel (accessible at /admin).
title, body, published_at) and save.Display Content in Blade: Fetch and render content in a Blade template:
@php
$article = \Appdezign\LaraProCms\Models\Content::where('type', 'article')->first();
@endphp
<h1>{{ $article->title }}</h1>
<div>{!! $article->body !!}</div>
Key Documentation:
php artisan lara-pro-cms:docs for local documentation (if available).RichText, Media, Relationship) for content types.
// Example: Extend a content type via a service provider
public function boot()
{
\Appdezign\LaraProCms\Facades\LaraProCms::extendContentType('article', function ($builder) {
$builder->addField(\Appdezign\LaraProCms\Fields\Field::make('author')
->type('relationship')
->relatedTo(\App\Models\User::class));
});
}
Field::make('title')
->rules('required|max:255')
->label('Article Title');
Route::get('/articles/{slug}', [ArticleController::class, 'show'])
->name('articles.show');
public function show($slug)
{
$article = \Appdezign\LaraProCms\Facades\LaraProCms::content()
->where('type', 'article')
->where('slug', $slug)
->firstOrFail();
return view('articles.show', compact('article'));
}
lara-pro-cms:routes command to generate routes for all content types:
php artisan lara-pro-cms:routes
Field::make('featured_image')
->type('media')
->collection('images');
locale field:
Field::make('title')
->translatable()
->label('Title');
$article = \Appdezign\LaraProCms\Facades\LaraProCms::content()
->where('type', 'article')
->locale('nl')
->first();
// config/lara-pro-cms.php
'filament' => [
'resources' => [
\Appdezign\LaraProCms\Filament\Resources\ContentTypeResource::class,
// Override with your custom resource
\App\Filament\Resources\CustomContentTypeResource::class,
],
];
public function registerWidgets()
{
return [
new \Appdezign\LaraProCms\Filament\Widgets\ContentOverviewWidget(),
new \App\Filament\Widgets\CustomWidget(),
];
}
Route::get('/api/articles', function () {
return \Appdezign\LaraProCms\Facades\LaraProCms::content()
->where('type', 'article')
->get();
});
api facade for structured responses:
return \Appdezign\LaraProCms\Facades\LaraProCms::api()->content($article);
Leverage Events:
Subscribe to content events (e.g., ContentCreated, ContentUpdated) in EventServiceProvider:
protected $listen = [
\Appdezign\LaraProCms\Events\ContentCreated::class => [
\App\Listeners\SendContentNotification::class,
],
];
Custom Field Types:
Create reusable field types by extending \Appdezign\LaraProCms\Fields\Field:
namespace App\Fields;
use Appdezign\LaraProCms\Fields\Field;
class CustomField extends Field
{
public static function make($name)
{
return parent::make($name)->type('custom');
}
public function getView()
{
return 'lara-pro-cms::fields.custom';
}
}
Seeding Content:
Use the ContentSeeder to populate initial data:
php artisan db:seed --class=LaraProCmsSeeder
Or create a custom seeder:
use Appdezign\LaraProCms\Models\Content;
public function run()
{
Content::create([
'type' => 'article',
'title' => 'Hello World',
'slug' => 'hello-world',
'data' => json_encode(['body' => '<p>Test content</p>']),
]);
}
Caching: Cache content queries for performance:
$article = \Appdezign\LaraProCms\Facades\LaraProCms::content()
->where('type', 'article')
->remember(60) // Cache for 60 minutes
->first();
Field Data Serialization:
data column. Ensure complex data is serializable:
// Avoid storing unsupported types (e.g., Closures, Resources)
$field->setData(json_encode($value));
Slug Conflicts:
generateSlug method in your content type:
\Appdezign\LaraProCms\Facades\LaraProCms::extendContentType('article', function ($builder) {
$builder->setSlugGenerator(function ($title) {
return Str::slug($title . '-' . uniqid());
});
});
Filament Permissions:
/admin). Configure roles in config/filament.php:
'pages' => [
'dashboard' => \App\Filament\Pages\Dashboard::class,
'admin' => \Appdezign\LaraProCms\Filament\Pages\AdminPage::class,
],
Livewire Conflicts:
composer.json for constraints. Update Livewire via:
composer require livewire/livewire:^4.0
Media Storage:
config/filesystems.php points to the correct disk for media uploads. Defaults to public:
'disks' => [
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
],
],
Tailwind CSS:
resources/css/app.css includes Tailwind directives:
@tailwind base;
@tailwind components;
@tailwind
How can I help you explore Laravel packages today?