patelshubhampatel / admin-toolkit
Production-ready Laravel 12 admin toolkit: CRUD generator, CSV, PDF, roles, dynamic forms
1.0.0
2026-05-22 08:33 UTC
Requires
- php: ^8.2
- barryvdh/laravel-dompdf: ^3.0
- laravel/framework: ^12.0
- maatwebsite/excel: ^3.1
- spatie/laravel-permission: ^6.0
Requires (Dev)
- orchestra/testbench: ^9.0
- phpunit/phpunit: ^11.0
This package is not auto-updated.
Last update: 2026-05-23 06:50:36 UTC
README
Production-ready Laravel 12 admin toolkit.
Install
composer require shubham/admin-toolkit
Publish assets:
php artisan vendor:publish --tag=toolkit-config php artisan vendor:publish --tag=toolkit-views php artisan vendor:publish --tag=toolkit-migrations php artisan migrate
Install Spatie permission tables:
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
php artisan migrate
CRUD Generator
php artisan toolkit:crud Product
php artisan toolkit:crud Product --force # overwrite
Generates:
app/Models/Product.phpdatabase/migrations/*_create_products_table.phpapp/Repositories/ProductRepository.phpapp/Services/ProductService.phpapp/Http/Requests/ProductRequest.phpapp/Http/Controllers/Admin/ProductController.phpresources/views/product/{index,form,show}.blade.php- Appends routes to
routes/web.php
Dynamic Form Builder
JSON Schema
{
"fields": [
{ "type": "text", "name": "title", "label": "Title", "required": true },
{ "type": "textarea", "name": "body", "label": "Body", "required": false },
{ "type": "select", "name": "status", "label": "Status", "required": true,
"options": ["Active", "Inactive"] },
{ "type": "date", "name": "due", "label": "Due Date" },
{ "type": "checkbox", "name": "tags", "label": "Tags",
"options": ["PHP", "Laravel", "Vue"] },
{ "type": "radio", "name": "type", "label": "Type",
"options": ["Free", "Paid"] },
{ "type": "file", "name": "doc", "label": "Upload" },
{
"type": "repeater", "name": "items", "label": "Line Items",
"subfields": [
{ "name": "product", "label": "Product" },
{ "name": "qty", "label": "Qty" }
]
}
]
}
In Controller
use Shubham\AdminToolkit\Facades\FormBuilder; // Render HTML $html = FormBuilder::render($schema, $existingValues); // Validate $validated = FormBuilder::validate($schema, $request->all()); // Save $submission->update(['form_data' => FormBuilder::prepareForStorage($schema, $validated)]); // Load for editing $hydrated = FormBuilder::hydrateSchema($schema, $submission->form_data);
In Blade
<form method="POST" enctype="multipart/form-data"> @csrf {!! render_form($schema, $values) !!} <button class="btn btn-primary">Submit</button> </form>
Use HasDynamicForm trait on any model
use Shubham\AdminToolkit\Traits\HasDynamicForm; class Order extends Model { use HasDynamicForm; protected $casts = ['form_data' => 'array']; } // Usage: $order->renderForm($schema); // render HTML $order->fillFormData($schema, $data)->save(); $order->getFormValue('status');
CSV Import/Export
use Shubham\AdminToolkit\Exports\GenericExport; use Shubham\AdminToolkit\Imports\GenericImport; use Maatwebsite\Excel\Facades\Excel; // Export Excel::download(new GenericExport(Product::all(), ['id','name','status']), 'products.csv'); // Import (queued, chunked by 1000) Excel::import(new GenericImport(Product::class, ['Product Name' => 'name']), $request->file('file'));
PDF Export
use Shubham\AdminToolkit\Services\PdfService; $pdf = app(PdfService::class); // From view return $pdf->streamFromView('your.view', compact('items')); // Generic list return $pdf->exportList($products, ['id', 'name', 'status'], 'Products Report');
Role Management
use Shubham\AdminToolkit\Services\RoleService; $roles = app(RoleService::class); // Create role with permissions $roles->createRole('editor', ['create-post', 'edit-post']); // Seed permissions for a resource $roles->seedResourcePermissions('product'); // view-product, create-product, ... // Assign role to user $roles->assignRole($user, 'editor'); // Filtered nav menu $menu = toolkit_menu([ ['label' => 'Products', 'url' => '/products', 'permission' => 'view-product'], ]);
Middleware usage (in routes)
Route::middleware('role:super-admin')->group(fn() => /* ... */); Route::middleware('permission:edit-product')->group(fn() => /* ... */);
Helpers
toolkit_config('pagination') // config('toolkit.X') render_form($schema, $values) // shortcut for FormBuilder::render() toolkit_menu($menuArray) // filter menu by auth user permissions is_super_admin() // bool toolkit_paginate() // int from config
Facades
use Shubham\AdminToolkit\Facades\AdminToolkit; use Shubham\AdminToolkit\Facades\FormBuilder; AdminToolkit::pdf()->exportList(...); AdminToolkit::roles()->allRoles(); FormBuilder::render($schema);
API Endpoints (Sanctum auth required)
| Method | URL | Description |
|---|---|---|
| POST | /api/toolkit/forms/render |
Render HTML from schema |
| POST | /api/toolkit/forms/submit |
Validate + save |
| GET | /api/toolkit/forms/submission/{id} |
Load submission |
Config
config/toolkit.php:
'prefix' => 'admin', 'middleware' => ['web', 'auth', 'toolkit.auth'], 'pagination' => 15, 'pdf' => ['paper' => 'a4', 'orientation' => 'portrait'], 'csv' => ['chunk_size' => 1000, 'queue' => 'default'], 'form_builder' => ['storage_column' => 'form_data', 'table' => 'form_submissions'], 'roles' => ['super_admin' => 'super-admin', 'guard' => 'web'],