laravel-admin/crud
Experimental Laravel package providing a ResourceController for quick CRUD admin modules. Define a model plus singular/plural names, add resource routes, and override methods to declare form fields, validation rules, and payload transforms. Includes Bootstrap-friendly views.
Installation
composer require laravel-admin/crud
Add to config/app.php:
LaravelAdmin\Crud\CrudServiceProvider::class,
Create a Resource
php artisan make:model Blog -mcr
php artisan migrate)Blog.php)BlogController.php)Define Routes
// routes/web.php
Route::resource('blog', BlogController::class);
Extend ResourceController
// BlogController.php
use LaravelAdmin\Crud\Controllers\ResourceController;
class BlogController extends ResourceController
{
protected $model = Blog::class;
protected $singular_name = "blog";
protected $plural_name = "blogs";
}
First Use Case
Visit /blog to see a pre-built CRUD interface with:
Field Configuration
Override getFields() to define form fields:
protected function getFields()
{
return [
'title' => 'text',
'content' => 'textarea',
'published_at' => 'datetime',
];
}
Validation Rules
Override getValidationRulesOnStore()/getValidationRulesOnUpdate():
protected function getValidationRulesOnStore()
{
return [
'title' => 'required|string|min:6',
'content' => 'required|string',
];
}
Customizing List Columns
Override getListColumns():
protected function getListColumns()
{
return [
'id' => 'ID',
'title' => 'Title',
'published_at' => 'Published At',
];
}
Relationships
Define relationships in getRelationships():
protected function getRelationships()
{
return [
'author' => 'belongsTo:App\User',
];
}
Actions
Add custom actions via getActions():
protected function getActions()
{
return [
'publish' => [
'label' => 'Publish',
'method' => 'POST',
'url' => '/blog/{id}/publish',
'button_class' => 'btn-success',
],
];
}
Form Customization
Override getCreateFormFields()/getEditFormFields() for granular control:
protected function getCreateFormFields()
{
return [
'title' => ['type' => 'text', 'label' => 'Blog Title'],
'content' => ['type' => 'textarea', 'label' => 'Content'],
];
}
Search & Filtering
Override getSearchableFields():
protected function getSearchableFields()
{
return ['title', 'content'];
}
Bulk Actions
Enable via enableBulkActions():
protected function enableBulkActions()
{
return true;
}
Experimental Status
Missing show Method
show method is intentionally omitted. Implement manually if needed:public function show($id)
{
$blog = $this->model::findOrFail($id);
return view('blog.show', compact('blog'));
}
Validation Overrides
getValidationRulesOnStore() will break validation.->rules() for dynamic rules:
protected function getValidationRulesOnStore()
{
return [
'title' => ['required', 'string', Rule::unique('blogs')->ignore($this->model)],
];
}
Field Type Mismatches
getFields() match database columns (e.g., datetime vs. timestamp).getFieldType() for custom logic:
protected function getFieldType($field)
{
return match($field) {
'published_at' => 'date',
default => parent::getFieldType($field),
};
}
Relationship Loading
getListQuery() to avoid N+1 queries:
protected function getListQuery()
{
return $this->model::with('author')->query();
}
CSRF Token Issues
publish) may fail if CSRF protection isn’t handled. Use:
Route::post('/blog/{id}/publish', [BlogController::class, 'publish'])->name('blog.publish');
Bootstrap Dependency
resources/views/vendor/laravel-admin/crud.Log Queries Enable Laravel debugging:
DEBUG_BAR=true
DB_DEBUG=true
Check Controller Methods
getListData() to inspect query results:
protected function getListData()
{
$data = parent::getListData();
\Log::info('List Data:', $data);
return $data;
}
Validation Errors
protected function store()
{
$rules = $this->getValidationRulesOnStore();
$validator = Validator::make(request()->all(), $rules);
\Log::info('Validation Rules:', $rules);
\Log::info('Validation Errors:', $validator->errors());
// ...
}
View Rendering
getView() to debug rendered views:
protected function getView($method)
{
$view = parent::getView($method);
\Log::info("Rendering view: $view");
return $view;
}
Custom Views
php artisan vendor:publish --tag=laravel-admin-crud-views
resources/views/vendor/laravel-admin/crud/.API Integration
getListData():
public function index()
{
return response()->json($this->getListData());
}
Middleware
public function store()
{
$this->middleware('auth.admin')->only(['store']);
// ...
}
Events
creating, created):
$this->model::creating(function ($model) {
$model->user_id = auth()->id();
});
Localization
// config/laravel-admin-crud.php
'labels' => [
'blog' => [
'singular' => 'Post',
'plural' => 'Posts',
],
],
How can I help you explore Laravel packages today?