easy-admin-bundle
Rapid Symfony admin panel development with EasyAdminBundle. Capabilities: CRUD generation, dashboard creation, entity management, form customization, menu configuration, field configuration, action customization, filters, permissions, batch actions, custom themes, file uploads, image handling, associations, submenus, custom queries, event listeners. Use for: admin panels, backend interfaces, content management, data administration, CRUD operations, user management, product catalogs, blog administration, e-commerce backends. Triggers: easyadmin, symfony admin, crud, admin panel, dashboard, backend, entity crud, admin interface, symfony backend, easyadmin, easyadmin bundle, admin generator, backend panel
EasyAdmin Bundle Skill
Build Symfony admin panels with EasyAdminBundle 4.x. Quick examples and patterns for CRUD interfaces.
Requirements: PHP 8.1+, Symfony 5.4+, Doctrine ORM
Quick Start
# Install
composer require easycorp/easyadmin-bundle
# Create dashboard
php bin/console make:admin:dashboard
# Create CRUD controllers
php bin/console make:admin:crud
Visit /admin in your browser.
Complete API: Fields | Actions | CRUD | Filters | Dashboard
Dashboard Setup
namespace App\Controller\Admin;
use EasyCorp\Bundle\EasyAdminBundle\Config\{Dashboard, MenuItem};
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractDashboardController;
class DashboardController extends AbstractDashboardController
{
#[Route('/admin', name: 'admin')]
public function index(): Response
{
return $this->render('admin/dashboard.html.twig');
}
public function configureDashboard(): Dashboard
{
return Dashboard::new()->setTitle('My Admin Panel');
}
public function configureMenuItems(): iterable
{
yield MenuItem::linkToDashboard('Dashboard', 'fa fa-home');
yield MenuItem::linkToCrud('Posts', 'fa fa-newspaper', Post::class);
yield MenuItem::linkToCrud('Categories', 'fa fa-tags', Category::class);
}
}
CRUD Controllers
namespace App\Controller\Admin;
use App\Entity\Product;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Field\*;
class ProductCrudController extends AbstractCrudController
{
public static function getEntityFqcn(): string
{
return Product::class;
}
public function configureCrud(Crud $crud): Crud
{
return $crud
->setEntityLabelInSingular('Product')
->setSearchFields(['name', 'sku'])
->setDefaultSort(['createdAt' => 'DESC']);
}
public function configureFields(string $pageName): iterable
{
yield TextField::new('name');
yield MoneyField::new('price')->setCurrency('USD');
yield AssociationField::new('category')->autocomplete();
yield ImageField::new('photo')
->setBasePath('uploads')
->setUploadDir('public/uploads');
yield BooleanField::new('isActive')->renderAsSwitch();
}
}
Add filters:
public function configureFilters(Filters $filters): Filters
{
return $filters
->add('name')
->add(BooleanFilter::new('isActive'));
}
See Fields, Actions, CRUD, Filters for complete examples
Common Patterns
Custom Query Filtering
public function createIndexQueryBuilder(/* ... */): QueryBuilder
{
$qb = parent::createIndexQueryBuilder(...func_get_args());
$qb->andWhere('entity.isActive = :active')
->setParameter('active', true);
return $qb;
}
Audit Trail
public function updateEntity(EntityManagerInterface $em, $entity): void
{
$entity->setUpdatedBy($this->getUser());
parent::updateEntity($em, $entity);
}
Security
return $crud->setEntityPermission('ROLE_ADMIN');
return $actions->setPermission(Action::DELETE, 'ROLE_SUPER_ADMIN');
More patterns in CRUD API
Configuration
# config/routes.yaml
admin:
resource: App\Controller\Admin\DashboardController
type: easyadmin
prefix: /admin
# config/packages/security.yaml
security:
access_control:
- { path: ^/admin, roles: ROLE_ADMIN }
Troubleshooting
- Routes not found:
php bin/console cache:clear - Images not displaying: Check
public/uploads/exists - Collections not saving: Add
->setFormTypeOptions(['by_reference' => false]) - Autocomplete not working:
composer require symfony/ux-autocomplete