laravel-panel-generator maintained by uttam-official
UttamOfficial Laravel Panel Generator
Composer package:
uttam-official/laravel-panel-generator
Main command:
php artisan panel:generate admin
php artisan panel:generate vendor
php artisan panel:generate --name=vendor
This package generates Laravel panels such as admin, vendor, seller, staff, or customer from reusable template files.
What it generates
For:
php artisan panel:generate admin --register-route --update-vite
it creates:
resources/views/admin/
resources/js/admin/
resources/css/admin/
routes/admin.php
app/Http/Controllers/Admin/
app/Http/Requests/Admin/
app/Http/Middleware/Admin/
app/Trait/
For:
php artisan panel:generate vendor --register-route --update-vite
it creates:
resources/views/vendor/
resources/js/vendor/
resources/css/vendor/
routes/vendor.php
app/Http/Controllers/Vendor/
app/Http/Requests/Vendor/
app/Http/Middleware/Vendor/
app/Trait/
app/Trait is common for the whole Laravel application. It is not generated inside Admin, Vendor, or any other panel folder.
Local installation inside a Laravel project
Paste this package folder here:
your-laravel-project/packages/UttamOfficial/LaravelPanelGenerator
The package composer file should be here:
your-laravel-project/packages/UttamOfficial/LaravelPanelGenerator/composer.json
Then run these commands from your Laravel project root:
composer config repositories.laravel-panel-generator path packages/UttamOfficial/LaravelPanelGenerator
composer require uttam-official/laravel-panel-generator:@dev
php artisan optimize:clear
After editing package files during local development, run:
composer dump-autoload
php artisan optimize:clear
If Composer copied instead of symlinked the package, run:
composer update uttam-official/laravel-panel-generator -W
php artisan optimize:clear
Check the command:
php artisan list panel
Generate panels
Generate admin:
php artisan panel:generate admin --register-route --update-vite
Generate vendor:
php artisan panel:generate vendor --register-route --update-vite
Generate with auth middleware:
php artisan panel:generate admin --middleware=web,auth --register-route --update-vite
Overwrite existing generated files:
php artisan panel:generate admin --force --register-route --update-vite
After package.json changes, run:
npm install
npm run dev
or:
npm run build
Where to paste your panel template files
Inside the package, use this folder:
packages/UttamOfficial/LaravelPanelGenerator/resources/panels/
Default template for all panels
Paste common panel template files here:
resources/panels/default/
views/
js/
css/
controllers/
requests/
middleware/
routes/
package.json
If you run panel:generate admin and no resources/panels/admin folder exists, the command uses resources/panels/default.
Panel-specific template
For admin-specific files, paste here:
resources/panels/admin/
views/
js/
css/
controllers/
requests/
middleware/
routes/
package.json
For vendor-specific files, paste here:
resources/panels/vendor/
views/
js/
css/
controllers/
requests/
middleware/
routes/
package.json
The command checks the panel-specific folder first. If it does not exist, it uses the default template.
Common system files
Files that should be common for the full Laravel app should go here:
resources/common/
For traits, paste here:
resources/common/trait/
Example:
resources/common/trait/Validation/FailedValidationTrait.php
resources/common/trait/Model/UuidTrait.php
They are copied to:
app/Trait/Validation/FailedValidationTrait.php
app/Trait/Model/UuidTrait.php
They are not copied to:
app/Trait/Admin/
app/Trait/Vendor/
The default trait namespace is:
App\Trait
If you prefer Laravel-style plural App\Traits, change config/panel-generator.php:
'paths' => [
'traits' => app_path('Traits'),
],
'namespaces' => [
'traits' => 'App\\Traits',
],
Where files go after generation
For admin:
resources/panels/admin/views/* -> resources/views/admin/*
resources/panels/admin/js/* -> resources/js/admin/*
resources/panels/admin/css/* -> resources/css/admin/*
resources/panels/admin/controllers/* -> app/Http/Controllers/Admin/*
resources/panels/admin/requests/* -> app/Http/Requests/Admin/*
resources/panels/admin/middleware/* -> app/Http/Middleware/Admin/*
resources/panels/admin/routes/* -> routes/admin.php
resources/common/trait/* -> app/Trait/*
For vendor:
resources/panels/vendor/views/* -> resources/views/vendor/*
resources/panels/vendor/js/* -> resources/js/vendor/*
resources/panels/vendor/css/* -> resources/css/vendor/*
resources/panels/vendor/controllers/* -> app/Http/Controllers/Vendor/*
resources/panels/vendor/requests/* -> app/Http/Requests/Vendor/*
resources/panels/vendor/middleware/* -> app/Http/Middleware/Vendor/*
resources/panels/vendor/routes/* -> routes/vendor.php
resources/common/trait/* -> app/Trait/*
If using the default template:
resources/panels/default/views/* -> resources/views/{panel}/*
resources/panels/default/js/* -> resources/js/{panel}/*
resources/panels/default/css/* -> resources/css/{panel}/*
resources/panels/default/controllers/* -> app/Http/Controllers/{Panel}/*
resources/panels/default/requests/* -> app/Http/Requests/{Panel}/*
resources/panels/default/middleware/* -> app/Http/Middleware/{Panel}/*
resources/panels/default/routes/* -> routes/{panel}.php
resources/common/trait/* -> app/Trait/*
Important template tokens
Use tokens in view/controller/request/route/middleware files so the same files can generate admin, vendor, seller, etc.
Blade views
Use:
@extends('___PANEL_VIEW_NAMESPACE___.layouts.app')
@include('___PANEL_VIEW_NAMESPACE___.layouts.partials.sidebar')
@vite(['___PANEL_CSS_PATH___/app.css', '___PANEL_JS_PATH___/app.js'])
{{ route('___PANEL_ROUTE_NAME___dashboard') }}
{{ route('___PANEL_ROUTE_NAME___auth.login') }}
For admin, these become:
@extends('admin.layouts.app')
@include('admin.layouts.partials.sidebar')
@vite(['resources/css/admin/app.css', 'resources/js/admin/app.js'])
{{ route('admin.dashboard') }}
{{ route('admin.auth.login') }}
Controllers
Use:
namespace ___PANEL_CONTROLLER_NAMESPACE___;
use ___PANEL_REQUEST_NAMESPACE___\Auth\LoginRequest;
return view('___PANEL_VIEW_NAMESPACE___.dashboard');
return redirect(route('___PANEL_ROUTE_NAME___auth.login'));
For admin, this becomes:
namespace App\Http\Controllers\Admin;
use App\Http\Requests\Admin\Auth\LoginRequest;
return view('admin.dashboard');
return redirect(route('admin.auth.login'));
Requests
Paste request templates here:
resources/panels/default/requests/Auth/LoginRequest.php
Use:
namespace ___PANEL_REQUEST_NAMESPACE___\Auth;
use ___COMMON_TRAIT_NAMESPACE___\Validation\FailedValidationTrait;
For admin, this becomes:
namespace App\Http\Requests\Admin\Auth;
use App\Trait\Validation\FailedValidationTrait;
Middleware
Paste middleware templates here:
resources/panels/default/middleware/___PANEL_CLASS___Middleware.php
Use:
namespace ___PANEL_MIDDLEWARE_NAMESPACE___;
class ___PANEL_MIDDLEWARE_CLASS___
{
// ...
}
For admin, this generates:
app/Http/Middleware/Admin/AdminMiddleware.php
For vendor, this generates:
app/Http/Middleware/Vendor/VendorMiddleware.php
Routes
Paste route templates here:
resources/panels/default/routes/___PANEL_SLUG___.php
Use:
use ___PANEL_CONTROLLER_NAMESPACE___\AuthController;
use ___PANEL_CONTROLLER_NAMESPACE___\DashboardController;
use Illuminate\Support\Facades\Route;
Route::middleware([___PANEL_ROUTE_MIDDLEWARE_ARRAY___])
->prefix('___PANEL_ROUTE_PREFIX___')
->as('___PANEL_ROUTE_NAME___')
->group(function () {
Route::controller(AuthController::class)->as('auth.')->group(function () {
Route::get('login', 'login')->name('login');
});
Route::controller(DashboardController::class)->group(function () {
Route::get('/', 'index')->name('dashboard');
});
});
For admin, this becomes routes/admin.php with prefix admin and route names like admin.dashboard.
package.json dependency merge
Paste frontend npm packages into the template package file:
resources/panels/default/package.json
resources/panels/admin/package.json
resources/panels/vendor/package.json
Example:
{
"dependencies": {
"@popperjs/core": "^2.11.8",
"bootstrap": "^5.3.3",
"jquery": "^3.7.1"
},
"devDependencies": {
"sass": "^1.77.0"
},
"scripts": {}
}
When you run:
php artisan panel:generate admin
the command checks the Laravel project's root package.json and adds only missing packages. If a package already exists in dependencies, devDependencies, peerDependencies, or optionalDependencies, it is skipped.
After generation, run:
npm install
Vite entries
The default layout uses Vite:
@vite(['___PANEL_CSS_PATH___/app.css', '___PANEL_JS_PATH___/app.js'])
For admin, this becomes:
@vite(['resources/css/admin/app.css', 'resources/js/admin/app.js'])
For vendor, this becomes:
@vite(['resources/css/vendor/app.css', 'resources/js/vendor/app.js'])
Use this option to try adding entries to vite.config.js automatically:
php artisan panel:generate admin --update-vite
If your Vite config is custom, add entries manually:
laravel({
input: [
'resources/css/app.css',
'resources/js/app.js',
'resources/css/admin/app.css',
'resources/js/admin/app.js',
],
refresh: true,
})
Then run:
npm run dev
or:
npm run build
Publish editable templates into the Laravel app
Instead of editing the package directly, you can publish templates:
php artisan vendor:publish --tag=panel-generator-panels
php artisan vendor:publish --tag=panel-generator-common
Then paste custom files here:
resources/vendor/panel-generator/panels/default/
resources/vendor/panel-generator/panels/admin/
resources/vendor/panel-generator/panels/vendor/
resources/vendor/panel-generator/common/trait/
The command checks the published template path first. If a matching panel template exists there, it uses that. Otherwise, it uses the package template.
Options
php artisan panel:generate admin
php artisan panel:generate admin --force
php artisan panel:generate admin --register-route
php artisan panel:generate admin --middleware=web,auth
php artisan panel:generate admin --template=default
php artisan panel:generate admin --update-vite
php artisan panel:generate admin --skip-views
php artisan panel:generate admin --skip-js
php artisan panel:generate admin --skip-css
php artisan panel:generate admin --skip-assets
php artisan panel:generate admin --skip-controllers
php artisan panel:generate admin --skip-requests
php artisan panel:generate admin --skip-middleware
php artisan panel:generate admin --skip-traits
php artisan panel:generate admin --skip-routes
php artisan panel:generate admin --skip-package-json
Generate CRUD modules for a panel
Use this command when the panel already exists, or when you want the command to create/update the panel route file automatically:
php artisan panel:make-module User --panel=admin
php artisan panel:make-module Product --panel=vendor
With custom fields:
php artisan panel:make-module User --panel=admin --fields="name:string,email:string,password:string,status:boolean"
php artisan panel:make-module Product --panel=admin --fields="name:string,description:text:nullable,price:decimal,status:boolean"
For User in the admin panel, the command creates files only when they do not already exist:
app/Models/User.php
app/Http/Controllers/Admin/UserController.php
app/Http/Requests/Admin/User/StoreUserRequest.php
app/Http/Requests/Admin/User/UpdateUserRequest.php
database/migrations/YYYY_MM_DD_HHMMSS_create_users_table.php
resources/views/admin/users/index.blade.php
resources/views/admin/users/create.blade.php
resources/views/admin/users/edit.blade.php
resources/views/admin/users/show.blade.php
resources/views/admin/users/_form.blade.php
routes/admin.php
It also appends this resource route inside the existing routes/admin.php group if the route is not already present:
Route::resource('users', \App\Http\Controllers\Admin\UserController::class);
Generated route names become:
admin.users.index
admin.users.create
admin.users.store
admin.users.show
admin.users.edit
admin.users.update
admin.users.destroy
Generated URL examples:
/admin/users
/admin/users/create
/admin/users/{user}/edit
Module command options
php artisan panel:make-module User --panel=admin
php artisan panel:make-module User --panel=admin --force
php artisan panel:make-module User --panel=admin --register-route
php artisan panel:make-module User --panel=admin --fields="name:string,email:string,status:boolean"
php artisan panel:make-module User --panel=admin --table=users
php artisan panel:make-module User --panel=admin --route-uri=users
php artisan panel:make-module User --panel=admin --route-name=users
php artisan panel:make-module User --panel=admin --skip-model
php artisan panel:make-module User --panel=admin --skip-migration
php artisan panel:make-module User --panel=admin --skip-controller
php artisan panel:make-module User --panel=admin --skip-requests
php artisan panel:make-module User --panel=admin --skip-views
php artisan panel:make-module User --panel=admin --skip-routes
Use --register-route when the command creates a new routes/{panel}.php file and you also want it to add this line to routes/web.php:
require __DIR__ . '/admin.php';
Field syntax
Use this format:
field:type
field:type:nullable
Examples:
--fields="name:string,email:string,status:boolean"
--fields="title:string,description:text:nullable,price:decimal,published_at:date:nullable"
--fields="category_id:foreignId,name:string,sort_order:integer,status:boolean"
Supported basic types:
string
text
longText
integer
bigInteger
foreignId
boolean
date
dateTime
timestamp
decimal
json
Where to customize module CRUD templates
Default module templates are inside the package:
resources/modules/default/
models/
migrations/
controllers/
requests/
views/
routes/
To publish editable module templates into your Laravel app:
php artisan vendor:publish --tag=panel-generator-modules
Then edit:
resources/vendor/panel-generator/modules/default/
You can also create a module-specific template. For example:
resources/vendor/panel-generator/modules/user/
resources/vendor/panel-generator/modules/product/
The command checks the module-specific template first, then falls back to default.
Important module template tokens
Use these tokens inside module model, migration, controller, request, view, and route templates:
___PANEL_SLUG___
___PANEL_CLASS___
___PANEL_VIEW_NAMESPACE___
___PANEL_CONTROLLER_NAMESPACE___
___MODULE_CLASS___
___MODULE_TITLE___
___MODULE_PLURAL_TITLE___
___MODULE_VARIABLE___
___MODULE_PLURAL_VARIABLE___
___MODULE_TABLE___
___MODULE_ROUTE_URI___
___MODULE_ROUTE_NAME___
___MODULE_ROUTE_PREFIX___
___MODULE_VIEW_NAMESPACE___
___MODULE_MODEL_NAMESPACE___
___MODULE_MODEL_FULL_CLASS___
___MODULE_CONTROLLER_NAMESPACE___
___MODULE_REQUEST_NAMESPACE___
___MODULE_STORE_REQUEST_CLASS___
___MODULE_UPDATE_REQUEST_CLASS___
___MODULE_FILLABLE_ARRAY___
___MODULE_CASTS_ARRAY___
___MODULE_MIGRATION_COLUMNS___
___MODULE_STORE_RULES___
___MODULE_UPDATE_RULES___
___MODULE_FORM_FIELDS___
___MODULE_TABLE_HEADERS___
___MODULE_TABLE_CELLS___
___MODULE_SHOW_ROWS___
For User --panel=admin, examples become:
___PANEL_VIEW_NAMESPACE___ => admin
___MODULE_VIEW_NAMESPACE___ => admin.users
___MODULE_ROUTE_PREFIX___ => admin.users.
___MODULE_MODEL_FULL_CLASS___ => App\Models\User