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

Cms Laravel Package

revision-ten/cms

A flexible CMS for Laravel with pages, posts, media, menus, and SEO tools, plus a clean admin UI and Blade-based templating. Publish content quickly, extend via config, and tailor every part to fit your application.

View on GitHub
Deep Wiki
Context7

Getting Started

  1. Install and inspect in parallel. Run composer require revision-ten/cms, but before writing any code open three things: composer.json (to confirm the Laravel/PHP constraints it supports), README.md, and the src/ tree. With a package at this maturity level, the source is the real documentation — the README is usually a skim.
  2. Register the provider (if not auto-discovered). Check composer.json for extra.laravel.providers. If it's absent (typical for older packages), add the provider manually to config/app.php or bootstrap/providers.php depending on your Laravel version.
  3. Publish and migrate in one pass.
    php artisan vendor:publish --provider="RevisionTen\Cms\CmsServiceProvider"
    php artisan migrate
    
    Inspect database/migrations/ afterward — CMS packages frequently ship page, block, and revision tables, and you need to know what exists before you build on top of it.
  4. Run php artisan route:list to see what the package registered (admin panel, API, catch-all page route). This tells you whether it expects to own frontend routing or whether you wire it yourself.
  5. First use case: render a page. The fastest meaningful exercise is to create a page record (via the admin panel or a seeder), then add a catch-all route in routes/web.php that resolves a slug to a page and renders it through a Blade view. That single loop — create content → resolve → render — exercises config, models, and views simultaneously.

Implementation Patterns

Slug-based catch-all routing. Most CMS packages of this shape expect a low-priority catch-all. Register it last in routes/web.php so your app routes win:

Route::get('/{slug?}', [PageController::class, 'show'])->where('slug', '.*');

Resolve via the package's page repository/model, return 404 when no match exists, and cache the lookup.

Block/component composition. Typical day-to-day work with a CMS package is registering block types and rendering them. Look for a block registry or config array where you map a block key to a view (and optionally a Livewire/Blade component). Keep the mapping in a dedicated config file so designers can add block types without touching PHP.

Wrap the package behind your own layer. Don't let controllers, views, and Blade templates call package facades directly. Introduce a thin PageRepository / ContentService that wraps model queries and returns your own DTOs. When (not if) you need to swap a query, add caching, or patch around a bug, you change one class instead of a dozen views.

Cache aggressively, invalidate on save. CMS packages are read-heavy. Cache resolved pages by slug + locale, keyed to a version, and flush that version inside a model saved/deleted observer. This is the single highest-value pattern for performance.

Headless/API usage. If the package exposes API routes, consume them from your SPA via the JSON endpoints rather than the Blade layer; if not, add a small controller that serializes pages to arrays. Keep this in a separate route group so you can rate-limit independently.

Admin panel as a separate guard. If an admin UI is shipped, move it onto its own route prefix, middleware, and guard. Don't let it share the default web guard — content editors and app users are distinct audiences.

Seeder-driven fixtures for tests. Create pages/blocks in factories or seeders so feature tests can hit your catch-all route and assert markup. This is the fastest way to verify that package upgrades don't break rendering.

Gotchas and Tips

  • Treat it as unmaintained until proven otherwise. Six stars and zero dependents means no community safety net. Pin to an exact version ("revision-ten/cms": "1.2.*" or a commit hash), and read CHANGELOG.md before any update. If a bug blocks you, fork it or copy the relevant classes into app/ rather than patching vendor/.
  • Check the Laravel version constraint first. Small packages often lag. If it requires an older Laravel, verify it works on your version before building features — don't discover this after three days of work.
  • Publishing can overwrite. vendor:publish without a --tag may clobber customized config or views. Publish once, commit the published files, and use tags from then on. If the package doesn't support tags, diff before re-publishing.
  • Migrations are yours now. Once published, they live in your repo. Don't delete them; if the package ships new migrations, port them manually rather than re-publishing (which can drop custom columns).
  • Debugging checklist. php artisan route:list (are the package routes even registered?), php artisan config:clear after config edits, storage/logs/laravel.log, and php artisan tinker to query the page model directly. If routes 404, it's almost always provider registration or route precedence.
  • Route precedence bites. A catch-all /{slug} will shadow any route registered after it, including admin and API endpoints. Always register content routes last and use where() constraints.
  • Understand revision semantics early. Given the package name, versioned/revisioned content is likely core. Before relying on it, inspect how revisions are stored and which one is "live." If the semantics are unclear from the source, build your own published_at flag rather than guessing.
  • Extension points to prefer. Config-driven block registration, publishable views you can override (resources/views/vendor/...), and model save/delete events. Prefer these over subclassing package models — subclassing tends to break relationship resolution.
  • Isolate in tests. Feature-test the CMS integration in its own suite so a package upgrade failure doesn't obscure failures in your app code.
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.
jinas/dhivatar
store-doc/laravel-storage-driver
plus-it/laravel-translation-manager
diephp/perhaps
diephp/telegraph
osmaviation/spreadsheet
microsoft/fluentui-system-icons
mmccook/php-json-canonicalization-scheme
middlewares/firewall
qubiqx/montapacking
nyoncode/laravel-package-console
pnscripts/filament-broadquill-lite
pnscripts/laravel-sentfold-lite
vleap/mx-sdk-laravel-internal
twidpay/utils
htetmyathlaing/scout-elasticsearch-driver
artisan-toolbox/front-awesome
ls/client-assistant
users-au/laravel-client
cgv/localized-resource