Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Module Pages Laravel Package

cvepdb-cms/module-pages

View on GitHub
Deep Wiki
Context7

Getting Started

First Steps

  1. 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
    
  2. Basic Setup Register the module in config/cms.php under modules:

    'modules' => [
        'pages' => [
            'enabled' => true,
            'routes' => [
                'prefix' => 'pages',
            ],
        ],
    ],
    
  3. 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.


Implementation Patterns

Core Workflows

  1. Page Management

    • CRUD via Eloquent: Extend Cvepdb\Pages\Models\Page for custom logic.
      $pages = Page::where('is_published', true)->get();
      
    • Slug Handling: Use Page::generateSlug() for auto-slugging:
      $page->slug = Page::generateSlug($page->title);
      
  2. Routing

    • Dynamic Routes: The module registers a pages/{slug} route. Override in routes/web.php:
      Route::get('/custom/{slug}', [PageController::class, 'show'])->name('pages.custom');
      
    • Middleware: Protect routes with pages.middleware (e.g., auth):
      Route::middleware(['auth', 'pages.middleware'])->group(function () {
          Route::resource('admin/pages', PageController::class);
      });
      
  3. Templates & Views

    • Blade Integration: Use @include('pages::partials.content', ['page' => $page]) for shared layouts.
    • Custom Views: Override templates in resources/views/vendor/pages/ (e.g., edit.blade.php).
  4. API Endpoints

    • RESTful API: Enable via config:
      'api' => [
          'enabled' => true,
      ],
      
    • Custom API Logic: Extend Cvepdb\Pages\Http\Controllers\Api\PageController.
  5. Events & Observers

    • Listen for Events: Subscribe to PageCreated, PageUpdated:
      event(new \Cvepdb\Pages\Events\PageCreated($page));
      
    • Observers: Register in AppServiceProvider:
      Page::observe(\Cvepdb\Pages\Observers\PageObserver::class);
      

Gotchas and Tips

Common Pitfalls

  1. Slug Conflicts

    • Issue: generateSlug() may produce duplicates if not handled.
    • Fix: Use a unique suffix or implement a custom resolver:
      $page->slug = strtolower($page->title . '-' . uniqid());
      
  2. Route Caching

    • Issue: Routes may not update after changes if cached.
    • Fix: Clear routes:
      php artisan route:clear
      
  3. Middleware Misconfiguration

    • Issue: pages.middleware may block unintended routes.
    • Fix: Verify middleware in app/Http/Kernel.php:
      'pages.middleware' => \Cvepdb\Pages\Http\Middleware\CheckPageStatus::class,
      
  4. Content Security

    • Issue: Raw HTML content may expose XSS risks.
    • Fix: Sanitize content before rendering:
      use Purifier;
      echo Purifier::clean($page->content);
      
  5. Database Indexes

    • Issue: Large datasets may slow queries on slug.
    • Fix: Add an index in migrations:
      Schema::table('pages', function (Blueprint $table) {
          $table->index('slug');
      });
      

Pro Tips

  1. Localization

    • Use Page::setTranslations() for multilingual support:
      $page->setTranslations(['title' => ['en' => 'About', 'es' => 'Sobre Nosotros']]);
      
  2. SEO Optimization

    • Extend the Page model to add meta tags:
      public function getMetaDescription()
      {
          return Str::limit($this->content, 160);
      }
      
  3. Performance

    • Eager Load Relationships:
      $pages = Page::with('author', 'categories')->get();
      
    • Caching: Cache published pages:
      Cache::remember("page:{$page->slug}", now()->addHours(1), function () use ($page) {
          return $page;
      });
      
  4. Testing

    • Use PagesServiceProvider in tests/TestCase:
      $this->app->register(\Cvepdb\Pages\PagesServiceProvider::class);
      
    • Test routes with:
      $this->get('/pages/about')->assertOk();
      
  5. Extending Functionality

    • Custom Fields: Add traits or use Laravel Scout for search:
      use Laravel\Scout\Searchable;
      class Page extends Model {
          use Searchable;
      }
      
    • Plugins: Hook into pages.created events for third-party integrations (e.g., analytics).
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
likyly/sdk
tdt/input
coreation/php-shapefile
coreation/gisconverter
primix/widgets
primix/notifications
primix/actions
primix/tables
primix/details
primix/forms
primix/support
marcelgwerder/laravel-api-handler
firebrikdotcom/conveyor-laravel-broadcaster
kanata-php/conveyor-laravel-broadcaster
alish/short-message
sonrac/lumen-league-oauth2
pushery/sanctum-hardening-for-laravel
evanschleret/laravel-uuidable
yigit-serin/laravel-openvidu
adachsoft/command-executor-lib