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

Universal Panel Laravel Package

manggala/universal-panel

Universal Panel offers a flexible, configurable admin panel for Laravel apps, helping you build dashboards, resource CRUD screens, and management interfaces quickly with minimal boilerplate and full control over layout, navigation, and access.

View on GitHub
Deep Wiki
Context7

Getting Started

  1. composer require manggala/universal-panel — requires PHP ^8.2 and Laravel ^10 || ^11 || ^12. Nothing to build on the frontend: the default stack is 'blade', so you get a working panel before you touch Vite.

  2. Run php artisan universal-panel:doctor immediately after install. It is the fastest smoke test in the package — it checks PHP version, PDO, Mbstring, and whether your Vite build is healthy. If the panel renders blank or 500s on first boot, run this before reading a single stack trace.

  3. Publish config/assets and register your first panel in a service provider using the fluent builder from the release notes:

    Panel::make('superadmin')->path('superadmin')->role('Superadmin');
    
  4. Authentication is plug-and-play — /admin/login, /admin/register, /admin/forgot-password, /admin/reset-password, /admin/logout ship as views. Create the role your panel expects (make:role) before you hit the login page, or the role-based redirect will have nowhere to land.

  5. First real use case: scaffold one CRUD end-to-end with php artisan make:panel-resource Post --generate. The --generate flag writes the Eloquent model and migration for you — review the migration, migrate, then visit /admin/posts. That single loop (generate → migrate → visit) tells you more about the framework's opinions than the docs will.

Where to look first: the doctor command, config/universal-panel.php (panel/stack defaults), and the generated resource class from step 5 — that file is the template for everything else you'll write.

Implementation Patterns

One panel per audience, not per feature. The panel builder is designed around role-driven routing: superadmin at /superadmin, staff at /admin. Keep the mapping explicit (panel → path → role) and let the package handle post-login redirects. Resist creating a third and fourth panel for internal tooling; use the permission matrix instead.

Compose resources from generators, don't hand-roll. The suite gives you dedicated generators for forms, fields, actions, filters, and policies alongside the resource generator. The idiomatic workflow is resource → then generate the specific field/action/filter classes it needs, rather than inlining everything into one resource file. That keeps resources readable and makes custom field types reusable across modules.

Layer policies underneath the permission matrix. /admin/permissions is a GUI convenience — a checkbox matrix over modules (Posts, Pages, Media, Users, Security, Settings). Treat it as coarse gating. Generate policies (make:policy) for fine gating on individual records. Two layers, because the matrix alone won't express "editor can update their own posts only."

Let Spotlight fall out of registration. Cmd+K / Ctrl+K discovers registered CRUD resources automatically — you get quick search for free only if resources are registered through the panel. Custom system pages generally need explicit registration; if something isn't showing up in Spotlight, the first question is always "is it registered with the panel, or just a route?"

Pick the stack per panel. The multi-stack adapters (Blade, Livewire v2/v3, Inertia React, Inertia Vue v2/v3, REST) are a panel-level setting, not a global one. A common shape: Blade for the superadmin panel (zero build, fast iteration), Inertia Vue for a customer-facing panel. Resources are defined once; the adapter renders them. Test parity when you switch, because adapter coverage is rarely perfectly even.

Wire exporters/importers into background tasks. The importer/exporter and background task generators exist for a reason — CSV round-trips on any real dataset will exceed a request timeout. Generate the task, dispatch it, don't inline it in a controller action.

CI: add php artisan universal-panel:doctor as a pipeline step. It's a cheap gate that catches environment drift (missing extensions, stale Vite manifest) before deploy.

Gotchas and Tips

  • PHP version contradiction in the release notes. Compatibility says ^8.2 || ^8.3 || ^8.4, but doctor is documented as checking for PHP 8.4+. On 8.2 or 8.3 you may get a failing diagnostic on a supported install — treat the doctor's PHP check as advisory until the package clarifies, and pin your CI PHP version explicitly so the discrepancy can't surprise you.
  • laravel/framework ^13.0 is listed but does not exist yet. Constrain to ^10 || ^11 || ^12 in your own composer.json for now; the ^13 constraint is forward-looking and untested against a real release.
  • Route collisions on /admin. If you already own an /admin prefix, either move your existing routes or mount the panel elsewhere. Debug with php artisan route:list --path=admin — ordering matters and a wildcard from an earlier route will shadow the panel.
  • Generated migrations need a read. --generate infers table names, columns, and possibly soft-deletes from the resource name. Skim the migration before migrate; renaming a table after the resource is wired up is a much larger job.
  • Cache invalidation after matrix edits. Permission changes made through the GUI won't necessarily reflect immediately if you're caching gates/permissions. If a user's access looks stale, flush the relevant cache before assuming the matrix is broken.
  • Spotlight is resource-aware, not route-aware. It will not find arbitrary routes you've added to the panel. Anything missing from quick search is a registration problem, not a search bug.
  • Blade default ≠ zero assets. The 160px sidebar / 52px collapsed styling and .no-scrollbar utility are shipped CSS. Publish assets and confirm they're loading; a broken sidebar width almost always means unpublished or unbuilt assets, which doctor's Vite check will usually surface.
  • Pin your adapter majors. Livewire v2 vs v3 and Inertia Vue v2 vs v3 behave differently under the same adapter name. Lock the version explicitly rather than letting a minor bump change rendering behaviour underneath you.
  • Extension points worth knowing early: themes (make:theme) for branding, plugins (make:plugin) for packaging cross-panel features, and custom field/action generators for anything domain-specific. Reach for a plugin before forking package views.
  • This is v1.0.0. The API surface is newly stable and the package is opinionated and broad (27 commands, six adapters, an auth suite). Budget time for reading generated code rather than assuming conventions match the wider Laravel ecosystem, and read the changelog before each minor bump.
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.
shitoudev/permissionmanager
johannesclimacus/laravel-tui
hocvt/seotools
vitalybaev/sypexgeo
amphibee/themosis-ignition
gito-me/fast-excel
frankyso/laravel-ipaymu
geolize-studio/laravel-chile
boomerangui/chat
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