Installation
composer require suryahadiningrat/crud-generator
Publish the config file (if available):
php artisan vendor:publish --provider="Suryahadiningrat\CrudGenerator\CrudGeneratorServiceProvider"
Basic Usage
Generate a CRUD for an existing model (e.g., User):
php artisan crud:generate User
This creates:
app/Http/Controllers/UserController.php)resources/views/crud/user/)Where to Look First
config/crud-generator.php for customization (e.g., view paths, resource naming).Suryahadiningrat\CrudGenerator\Generators\CrudGenerator for logic.vendor/suryahadiningrat/crud-generator/resources/views/.First Use Case
Generate a CRUD for a Product model with custom fields:
php artisan crud:generate Product --fields="name:string,price:decimal,stock:int"
Verify the generated controller and views for basic CRUD operations (index, create, store, edit, update, destroy).
Model-Based Generation
name, email for User).--fields).--with-relations="posts" for a User model).View Customization
vendor/ to resources/views/crud/ to customize._form.blade.php) for reusable components.@extends in generated views to integrate with your app’s layout.Controller Integration
namespace App\Http\Controllers;
use Suryahadiningrat\CrudGenerator\Controllers\CrudController;
class ProductController extends CrudController
{
public function store(Request $request)
{
// Custom validation/logic before parent::store()
return parent::store($request);
}
}
routes/web.php if auto-registration is disabled:
Route::resource('products', \App\Http\Controllers\ProductController::class);
API Support
--api flag:
php artisan crud:generate Post --api
index(), show()).Testing
Product::class).actingAs() and followRedirects() to test CRUD flows.php artisan make:request StoreProductRequest
Update the generated controller to use the request class.authorize('update', $model)).created, updated) in the model to trigger side effects:
class Product extends Model
{
protected $dispatchesEvents = [
'created' => ProductCreated::class,
];
}
__('crud.labels.name')).Config Overrides
view_path) may not apply if the package lacks a publishable config.config/app.php or extend the service provider:
public function boot()
{
$this->app['crud-generator']->setViewPath(resource_path('views/custom-crud'));
}
Namespace Conflicts
--namespace flag or manually rename the controller:
php artisan crud:generate Product --namespace="Admin"
Relationship Handling
_form.blade.php template or extend the generator class to handle specific cases.Route Caching
php artisan route:clear
Blade Template Caching
php artisan view:clear
Suryahadiningrat\CrudGenerator\Generators\CrudGenerator:
\Log::debug('Generating CRUD for: ', [$modelName, $fields]);
@dump($model) or @dd($errors).php artisan route:list
Custom Generators Extend the base generator to add support for new features (e.g., soft deletes, activity logs):
namespace App\Generators;
use Suryahadiningrat\CrudGenerator\Generators\CrudGenerator as BaseGenerator;
class CustomCrudGenerator extends BaseGenerator
{
protected function generateController()
{
// Add custom logic (e.g., soft delete methods)
parent::generateController();
}
}
Register the custom generator in a service provider.
Dynamic Field Mapping Override field type handling in the generator to support custom database columns (e.g., JSON, enum):
protected function mapFieldType($field)
{
if (str_contains($field, 'json')) {
return 'textarea';
}
return parent::mapFieldType($field);
}
Event Hooks Listen for CRUD events to inject logic (e.g., logging, notifications):
// In EventServiceProvider
protected $listen = [
\Suryahadiningrat\CrudGenerator\Events\CrudGenerated::class => [
\App\Listeners\LogCrudGeneration::class,
],
];
Template Inheritance Use Laravel Mixins or Blade directives to extend generated views dynamically:
// In AppServiceProvider
Blade::directive('crudExtend', function ($expression) {
return "<?php echo \$__env->make('crud._extensions.$expression', []); ?>";
});
Then in a generated view:
@crudExtend('custom-form-fields')
.gitignore to exclude generated files or commit them to version control for reproducibility.// Custom: Added validation for 'price' field
$validator->rules['price'] = 'required|numeric|min:0';
How can I help you explore Laravel packages today?