Installation
Add the bundle to your composer.json:
composer require ekyna/admin-bundle
Register the bundle in config/bundles.php:
return [
// ...
Ekyna\AdminBundle\EkynaAdminBundle::class => ['all' => true],
];
Basic Configuration
Define a minimal config/packages/ekyna_admin.yaml:
ekyna_admin:
menu:
- { label: 'Dashboard', route: 'dashboard' }
resources:
App\Entity\User:
controller: 'Ekyna\AdminBundle\Controller\AdminController::indexAction'
template: '@EkynaAdmin/CRUD/index.html.twig'
First Use Case
Create a simple admin route in routes.yaml:
ekyna_admin:
resource: '@EkynaAdminBundle/Resources/config/routing.yml'
prefix: /admin
Access /admin to see the generated menu and resource listing.
Resource Management
ekyna_admin.resources config:
resources:
App\Entity\Product:
controller: 'App\Controller\Admin\ProductController'
template: 'admin/product/index.html.twig'
actions:
- { name: 'index', label: 'List' }
- { name: 'new', label: 'Create' }
Ekyna\AdminBundle\Controller\AdminController for custom logic.Menu Customization
menu:
- { label: 'Products', route: 'ekyna_admin_product_index' }
children:
- { label: 'Categories', route: 'ekyna_admin_category_index' }
isGranted() checks in Twig:
{% if is_granted('ROLE_ADMIN') %}
{{ render(ekyna_admin.menu_item('ekyna_admin_product_index')) }}
{% endif %}
Template Overrides
templates/admin/:
resources:
App\Entity\User:
template: 'admin/user/custom_index.html.twig'
Form Handling
Ekyna\AdminBundle\Form\Type\AdminType for entity forms:
$builder->add('name', TextType::class, ['label' => 'Product Name']);
VOTER for granular permissions:
security:
access_control:
- { path: ^/admin/product, roles: ROLE_PRODUCT_MANAGER }
Ekyna\AdminBundle\Repository\AdminRepository for queries.ekyna_admin.translation_domain in config for i18n support.Deprecated Practices
Symfony\Component\HttpFoundation\Request (use Symfony\Component\HttpFoundation\RequestStack).Twig\Extension).Configuration Overrides
null values gracefully. Always provide defaults:
resources:
App\Entity\Post:
template: ~ # Explicitly set to null if unused
main) may break if not defined. Use absolute routes instead.Class Existence Checks
Ekyna\AdminBundle\Pool\AdminPool classes exist before use. Override via:
ekyna_admin:
pool:
class: 'App\Admin\CustomAdminPool'
Resource Context
RequestStack:
public function __construct(RequestStack $requestStack) {
$this->request = $requestStack->getCurrentRequest();
}
Error Handling
Ekyna\AdminBundle\Exception\ResourceNotFoundException in a global exception handler:
public function onKernelException(GetResponseForExceptionEvent $event) {
$exception = $event->getThrowable();
if ($exception instanceof ResourceNotFoundException) {
return new Response('Custom 404', 404);
}
}
Frontend Quirks
addFlash() for notifications:
$this->addFlash('success', 'Product saved!');
EKYNA_ADMIN_DEBUG: true in .env for detailed logs.container.getParameter('ekyna_admin') to inspect loaded config.Ekyna\AdminBundle\Twig\AdminExtension for custom helpers:
{{ dump(ekyna_admin.getResourceConfig('App\Entity\User')) }}
Custom Controllers
Extend Ekyna\AdminBundle\Controller\AdminController and override methods like configure():
public function configure() {
$this->menu->addChild('custom', ['route' => 'custom_route']);
}
Event Listeners
Subscribe to ekyna_admin.resource.load events:
public function onResourceLoad(ResourceLoadEvent $event) {
$event->setTemplate('custom/template.html.twig');
}
Form Type Extensions
Override field types in config/packages/ekyna_admin.yaml:
ekyna_admin:
form_types:
App\Entity\User:
- { name: 'email', type: 'Symfony\Component\Form\Extension\Core\Type\EmailType' }
How can I help you explore Laravel packages today?