Installation
composer require devgeek/beacon-admin
Ensure symfony/doctrine-bundle and symfony/security-bundle are installed (required dependencies).
Basic Configuration
Add to config/packages/beacon_admin.yaml:
beacon_admin:
route_prefix: /admin
title: 'MyApp Admin'
menu:
- { label: 'Dashboard', route: beacon_admin_dashboard, icon: fas fa-tachometer-alt }
Route Import
Add to config/routes.yaml:
beacon_admin:
resource: '@BeaconAdminBundle/config/routes/beacon_admin.yaml'
prefix: /admin
First CRUD Controller
Generate a controller for an existing entity (e.g., Product):
php bin/console make:crud Admin/ProductCrudController App\Entity\Product
Extend AbstractCrudController and override getEntityClass():
class ProductCrudController extends AbstractCrudController
{
protected function getEntityClass(): string
{
return Product::class;
}
}
Access Admin Panel
Visit /admin (ensure Symfony Security is configured for /admin/* routes).
Auto-Generated CRUD The package auto-detects Doctrine entities and generates:
Customize List Columns
Override configureCrud() in your controller:
protected function configureCrud(CrudConfig $config): void
{
$config->setColumns(['id', 'name', 'price', 'createdAt']);
}
Add a Widget to Dashboard
Create a custom widget service and register it in beacon_admin.yaml:
beacon_admin:
dashboard:
widgets:
- { type: 'stats', title: 'Total Products', route: 'admin_product_index' }
AbstractCrudController for each entity.class UserCrudController extends AbstractCrudController
{
protected function getEntityClass(): string { return User::class; }
protected function configureCrud(CrudConfig $config): void
{
$config->setSearchFields(['email', 'username']);
$config->setActions(['edit', 'delete', 'custom_action']);
}
}
configureCrud(): Modify list view, search, actions, or columns.configureForm(): Customize form fields (e.g., disable a field).prePersist()/preUpdate(): Add logic before saving.$config->addAction(
'publish',
'fas fa-paper-plane',
'admin_user_publish',
'Publish',
['confirm' => 'Are you sure?']
);
publishAction()).configureForm():
protected function configureForm(FormBuilder $builder, array $options): void
{
$builder->remove('password'); // Hide sensitive fields
$builder->add('role', EntityType::class, [
'class' => Role::class,
'choice_label' => 'name',
]);
}
FormBuilder or FormInterface for advanced logic.devgeek/beacon-admin-charts), or custom HTML.beacon_admin.widget:
services:
App\Widget\CustomWidget:
tags: [beacon_admin.widget]
WidgetInterface:
class CustomWidget implements WidgetInterface
{
public function getTitle(): string { return 'Custom Data'; }
public function getContent(): string { return $this->twig->render('widget/custom.html.twig'); }
}
beacon_admin:
dashboard:
widgets:
- { type: 'custom', title: 'My Widget', service: 'App\Widget\CustomWidget' }
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
class AdminVoter extends Voter
{
protected function supports(string $attribute, $subject): bool
{
return $attribute === 'EDIT' && $subject instanceof Product;
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
return $token->getUser()->hasRole('ROLE_ADMIN');
}
}
security.yaml:
access_control:
- { path: ^/admin, roles: ROLE_ADMIN }
templates/BeaconAdminBundle/ (e.g., dashboard.html.twig).assets/beacon-admin/ and enable in beacon_admin.yaml:
beacon_admin:
assets:
css: ['/bundles/beaconadmin/custom.css']
js: ['/bundles/beaconadmin/custom.js']
prePersist) in your CRUD controller:
use Doctrine\ORM\Event\LifecycleEventArgs;
public function prePersist(LifecycleEventArgs $args): void
{
$entity = $args->getEntity();
$entity->setCreatedAt(new \DateTime());
}
public function apiExportAction(Request $request): JsonResponse
{
$data = $this->crudService->getAllData();
return new JsonResponse($data);
}
WebTestCase:
public function testCrudList()
{
$client = static::createClient();
$client->request('GET', '/admin/products');
$this->assertResponseIsSuccessful();
$this->assertSelectorTextContains('h1', 'Products');
}
Entity Metadata Caching
php bin/console cache:clear
php bin/console doctrine:cache:clear-metadata
Form Type Conflicts
DateTime instead of string for dates).php bin/console debug:form App\Entity\ProductType
Route Conflicts
ProductController may clash with API routes).Crud or Admin (e.g., ProductCrudController).Widget Registration
WidgetInterface and be tagged as beacon_admin.widget. Forgetting the tag will silently ignore the widget.Translation Issues
translations/messages.en.yaml:
'beacon_admin.action.edit': 'Modify'
Performance with Large Datasets
PARTIAL INDEXES or database views.CrudConfig:
$config->setItemsPerPage(50);
Enable Debug Mode
Set BEACON_ADMIN_DEBUG: true in .env to log SQL queries and widget errors.
Check Twig Errors
Enable Twig debug mode in config/packages/twig.yaml:
twig:
debug: '%kernel.debug%'
strict_variables: '%kernel.debug%'
Log Crud Events Add a subscriber to log CRUD actions:
class CrudLoggerSubscriber implements EventSubscriberInterface
{
public static function getSubscribed
How can I help you explore Laravel packages today?