Installation
composer require anh/admin-bundle
Add to config/app.php under providers:
Anh\AdminBundle\AdminBundle::class,
And under aliases:
'Admin' => Anh\AdminBundle\Facades\Admin::class,
Basic Configuration Publish the default config:
php artisan vendor:publish --provider="Anh\AdminBundle\AdminBundle" --tag="config"
Edit config/admin.php to define your admin routes (e.g., /admin).
First Use Case: CRUD for a Model
Create a controller extending Anh\AdminBundle\Controller\AbstractAdminController:
namespace App\Http\Controllers\Admin;
use Anh\AdminBundle\Controller\AbstractAdminController;
use App\Models\Post;
class PostController extends AbstractAdminController
{
public function model()
{
return Post::class;
}
}
Register the route in config/admin.php:
'routes' => [
'posts' => [
'path' => '/posts',
'controller' => App\Http\Controllers\Admin\PostController::class,
],
],
Model-Based CRUD
Extend AbstractAdminController and override model() to bind to an Eloquent model. The bundle auto-generates:
Custom Fields
Override fields() to define custom columns in the list view:
public function fields()
{
return [
'id' => 'ID',
'title' => 'Title',
'published_at' => 'Published At',
];
}
Form Customization
Override formFields() to customize create/edit forms:
public function formFields()
{
return [
'title' => 'text',
'content' => 'textarea',
'published_at' => 'datetime',
];
}
Actions
Add custom actions (e.g., bulk publish) via actions():
public function actions()
{
return [
'publish' => [
'method' => 'POST',
'label' => 'Publish',
'icon' => 'fas fa-bullhorn',
'handler' => [$this, 'handlePublish'],
],
];
}
Middleware Integration
Protect admin routes with middleware (e.g., auth.admin):
// config/admin.php
'middleware' => ['auth.admin'],
Views Overrides Override default Blade templates by publishing assets:
php artisan vendor:publish --provider="Anh\AdminBundle\AdminBundle" --tag="views"
Then modify resources/views/admin/....
php artisan vendor:publish --provider="Anh\AdminBundle\AdminBundle" --tag="public"
spatie/laravel-permission for role-based access.laravel-admin or backpack for advanced features.resources/lang/vendor/admin.Route Conflicts
Ensure config/admin.php paths don’t clash with existing routes. Use unique prefixes (e.g., /admin/v1/posts).
Model Requirements
The bundle assumes Eloquent models with fillable attributes. For custom logic, override methods like save() or delete().
CSRF Issues
Custom actions must include @csrf in Blade templates or use POST methods with Laravel’s built-in protection.
Asset Loading Published assets (CSS/JS) may not auto-reload in development. Clear caches:
php artisan view:clear
php artisan cache:clear
Database Queries
List views use eager loading by default. For complex relationships, override query():
public function query()
{
return $this->model->with(['author', 'category']);
}
APP_DEBUG=true) and check storage/logs/laravel.log.dd() or dump() in controller methods to inspect model instances or query results.php artisan route:list | grep admin
Custom Controllers
Extend AbstractAdminController to add methods like beforeIndex(), beforeStore(), etc.
Dynamic Routes
Use route parameters in config/admin.php:
'posts/{id}' => [
'controller' => App\Http\Controllers\Admin\PostController::class,
],
API Endpoints
Create separate controllers for API access (e.g., PostApiController) and reuse logic via traits.
Event Listeners
Listen to admin events (e.g., admin.model.created) for post-processing:
// EventServiceProvider
protected $listen = [
'admin.model.created' => [
App\Listeners\LogAdminActivity::class,
],
];
Service Providers Bind custom services to the container for dependency injection in controllers:
// AppServiceProvider
$this->app->bind(
Anh\AdminBundle\Services\CustomService::class,
App\Services\CustomService::class
);
How can I help you explore Laravel packages today?