Create Admin Panel with Laravel Backpack - Part 2
Create Admin Panel with Laravel Backpack - Part 2
Learn how to create and customize CRUD operations in your Laravel Backpack admin panel.
Introduction
In this part of the Laravel Backpack series, we'll dive deeper into creating and customizing CRUD operations. We'll learn how to create custom CRUD panels, add fields, and implement advanced features.
Prerequisites
- Completion of Part 1
- Basic understanding of Laravel
- Database configured
- Laravel Backpack installed
1 Create a New CRUD Panel
Generate a new CRUD panel for a model:
php artisan backpack:crud product
This will create:
- ProductController
- ProductRequest
- Product model
- Migration file
- Views
2 Configure the Model
Update your `app/Models/Product.php`:
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Backpack\CRUD\app\Models\Traits\CrudTrait;
class Product extends Model
{
use CrudTrait;
protected $fillable = [
'name',
'description',
'price',
'category_id',
'status'
];
public function category()
{
return $this->belongsTo(Category::class);
}
}
3 Configure the Controller
Update your `app/Http/Controllers/Admin/ProductCrudController.php`:
namespace App\Http\Controllers\Admin;
use App\Http\Requests\ProductRequest;
use Backpack\CRUD\app\Http\Controllers\CrudController;
use Backpack\CRUD\app\Library\CrudPanel\CrudPanelFacade as CRUD;
class ProductCrudController extends CrudController
{
use \Backpack\CRUD\app\Http\Controllers\Operations\ListOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\UpdateOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\DeleteOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\ShowOperation;
public function setup()
{
CRUD::setModel(\App\Models\Product::class);
CRUD::setRoute(config('backpack.base.route_prefix') . '/product');
CRUD::setEntityNameStrings('product', 'products');
}
protected function setupListOperation()
{
CRUD::column('name');
CRUD::column('price');
CRUD::column('category.name');
CRUD::column('status');
CRUD::column('created_at');
}
protected function setupCreateOperation()
{
CRUD::setValidation(ProductRequest::class);
CRUD::field('name');
CRUD::field('description')->type('textarea');
CRUD::field('price')->type('number');
CRUD::field('category_id')->type('select2')->entity('category')->attribute('name');
CRUD::field('status')->type('enum');
}
protected function setupUpdateOperation()
{
$this->setupCreateOperation();
}
}
4 Add Custom Fields
Add various field types to your CRUD:
// Text fields
CRUD::field('name')->type('text')->label('Product Name');
// Select fields
CRUD::field('category_id')
->type('select2')
->entity('category')
->attribute('name')
->label('Category');
// Date fields
CRUD::field('published_at')
->type('datetime')
->label('Publication Date');
// File upload
CRUD::field('image')
->type('image')
->crop(true)
->aspect_ratio(1);
// Rich text editor
CRUD::field('description')
->type('ckeditor')
->label('Product Description');
// Checkbox
CRUD::field('is_featured')
->type('checkbox')
->label('Featured Product');
5 Add Custom Operations
Add custom operations to your CRUD controller:
use \Backpack\CRUD\app\Http\Controllers\Operations\BulkDeleteOperation;
use \Backpack\CRUD\app\Http\Controllers\Operations\CloneOperation;
class ProductCrudController extends CrudController
{
use BulkDeleteOperation;
use CloneOperation;
public function setup()
{
// ... existing setup code ...
}
public function clone($id)
{
$entry = $this->crud->getEntry($id);
$clonedEntry = $entry->replicate();
$clonedEntry->name = $entry->name . ' (Clone)';
$clonedEntry->save();
return redirect()->back();
}
}
6 Add Custom Filters
Add filters to your list view:
protected function setupListOperation()
{
// ... existing columns ...
CRUD::filter('category')
->type('select2')
->label('Category')
->values(function() {
return \App\Models\Category::pluck('name', 'id')->toArray();
});
CRUD::filter('price')
->type('range')
->label('Price Range')
->label_from('Min')
->label_to('Max');
CRUD::filter('status')
->type('dropdown')
->label('Status')
->options([
'active' => 'Active',
'inactive' => 'Inactive',
'draft' => 'Draft'
]);
}
Key Features Covered
- CRUD panel generation
- Model configuration
- Controller setup
- Custom fields
- Custom operations
- Custom filters
Best Practices
- Use proper field types
- Implement validation
- Add helpful labels
- Use relationships
- Implement proper error handling
Common Issues
- Missing relationships
- Incorrect field types
- Validation errors
- Permission issues
- Missing dependencies