Installation Add the package via Composer:
composer require cvepdb-cms/module-pages
Publish the module’s configuration and migrations:
php artisan vendor:publish --provider="Cvepdb\Pages\PagesServiceProvider" --tag="config"
php artisan vendor:publish --provider="Cvepdb\Pages\PagesServiceProvider" --tag="migrations"
php artisan migrate
Basic Setup
Register the module in config/cms.php under modules:
'modules' => [
'pages' => [
'enabled' => true,
'routes' => [
'prefix' => 'pages',
],
],
],
First Use Case Create a page via Tinker or a controller:
use Cvepdb\Pages\Models\Page;
$page = Page::create([
'title' => 'About Us',
'slug' => 'about',
'content' => '<h1>Welcome</h1><p>Learn more about us.</p>',
'is_published' => true,
]);
Access it via a route (auto-generated by the module):
/pages/about.
Page Management
Cvepdb\Pages\Models\Page for custom logic.
$pages = Page::where('is_published', true)->get();
Page::generateSlug() for auto-slugging:
$page->slug = Page::generateSlug($page->title);
Routing
pages/{slug} route. Override in routes/web.php:
Route::get('/custom/{slug}', [PageController::class, 'show'])->name('pages.custom');
pages.middleware (e.g., auth):
Route::middleware(['auth', 'pages.middleware'])->group(function () {
Route::resource('admin/pages', PageController::class);
});
Templates & Views
@include('pages::partials.content', ['page' => $page]) for shared layouts.resources/views/vendor/pages/ (e.g., edit.blade.php).API Endpoints
'api' => [
'enabled' => true,
],
Cvepdb\Pages\Http\Controllers\Api\PageController.Events & Observers
PageCreated, PageUpdated:
event(new \Cvepdb\Pages\Events\PageCreated($page));
AppServiceProvider:
Page::observe(\Cvepdb\Pages\Observers\PageObserver::class);
Slug Conflicts
generateSlug() may produce duplicates if not handled.$page->slug = strtolower($page->title . '-' . uniqid());
Route Caching
php artisan route:clear
Middleware Misconfiguration
pages.middleware may block unintended routes.app/Http/Kernel.php:
'pages.middleware' => \Cvepdb\Pages\Http\Middleware\CheckPageStatus::class,
Content Security
use Purifier;
echo Purifier::clean($page->content);
Database Indexes
slug.Schema::table('pages', function (Blueprint $table) {
$table->index('slug');
});
Localization
Page::setTranslations() for multilingual support:
$page->setTranslations(['title' => ['en' => 'About', 'es' => 'Sobre Nosotros']]);
SEO Optimization
Page model to add meta tags:
public function getMetaDescription()
{
return Str::limit($this->content, 160);
}
Performance
$pages = Page::with('author', 'categories')->get();
Cache::remember("page:{$page->slug}", now()->addHours(1), function () use ($page) {
return $page;
});
Testing
PagesServiceProvider in tests/TestCase:
$this->app->register(\Cvepdb\Pages\PagesServiceProvider::class);
$this->get('/pages/about')->assertOk();
Extending Functionality
use Laravel\Scout\Searchable;
class Page extends Model {
use Searchable;
}
pages.created events for third-party integrations (e.g., analytics).How can I help you explore Laravel packages today?