lavalite/framework
Lavalite Framework is a modular Laravel CMS foundation for building admin panels and content-driven apps. It offers reusable packages, CRUD scaffolding, authentication, themes, and extensible modules to speed development.
composer create-project lavalite/lavalite myapp rather than adding lavalite/framework to a vanilla Laravel app. The framework alone is a thin layer — you also want lavalite/core, lavalite/user, lavalite/menu, lavalite/setting, and the admin theme for a working panel.config/lavalite.php, the packages/ directory (one folder per module), Lavalite\Framework\Providers in vendor, and the active theme under public/themes/ (or resources/themes/).php artisan migrate --seed), then log in at /admin with the seeded admin account. If the panel 404s, check that the framework/module service providers are registered and routes aren't cached.packages/<vendor>/<name> with the conventional layout: Providers/, Http/Controllers, Models, Repositories, resources/views, routes/web.php, config/, database/migrations. Register the service provider in config/app.php (or the framework's module loader if enabled).$this->app->bind(PageInterface::class, PageRepository::class)), and resolve through the container in controllers. Presenters/transformers are convention-based — a mismatched name silently yields empty output instead of an error.boot() (or ship seeders), and gate controllers with can:permission middleware tied to the team/workflow tables.status columns — you lose the audit trail and the admin UI wiring.theme() helper / Theme facade for asset paths, and keep custom CSS/JS in the theme's asset folder, not in the package.setting('group.key') helper. Cache reads but invalidate on save.Auth::guard('user') or 'admin' explicitly — don't rely on the default guard. Middleware and policy can() checks must match the guard the route uses.lavalite/* module set as a batch, then re-seed permissions/menus. Keep custom code confined to your own module and theme folders so the framework bump stays a composer update.lavalite/framework is not standalone. It expects sibling packages (core, user, menu, setting, workflow/team). Installing it alone produces a half-broken admin — pull the metapackage or the full project.v10.2.2 is described as the first release for the 12.x line, so the package tag does not track the Laravel version it supports. Don't infer Laravel compatibility from the tag — read the release notes for each tag and pin by constraint, not by "looks recent."lavalite/* dependency has a release supporting the same Laravel version before updating, and expect to re-run vendor:publish for changed tags.php artisan config:clear and route:clear after adding modules, menus, or settings — cached config/routes routinely make new registrations invisible. This bites hardest immediately after a version upgrade, where stale cached config masks new keys.migrate:fresh --seed over debugging individual migration failures.Presenter classes, and transformer methods must match what the base repository expects, or you get blank/null output with no exception thrown.menus/permissions tables before suspecting your service provider — and re-seed them after a major upgrade.php artisan route:list --path=admin, Log::debug() inside provider boot(), and dd() on the resolved repository. Vendor source is the real documentation — search for the base classes when the docs are thin.boot()/register(), any Action/Filter-style hooks your version exposes, theme view composers, and repository boot() methods.lavalite/framework and every lavalite/* module to a compatible constraint in composer.json, and smoke-test /admin after every bump — login, one CRUD save, one menu render, one permission-gated route.vendor:publish for the relevant tags and clear the public/ cache.How can I help you explore Laravel packages today?