Install the Bundle
composer require beefeater/crud-event-bundle
Enable in config/bundles.php:
return [
// ...
Beefeater\CrudEventBundle\BeefeaterCrudEventBundle::class => ['all' => true],
];
Define a CRUD Configuration
Create a YAML file (e.g., config/crud/v1/posts.yaml):
resources:
App\Entity\Post:
operations:
list: ~
create: ~
read: ~
update: ~
delete: ~
Register Routes
Add to config/routes.yaml:
crud_api_v1:
resource: '%kernel.project_dir%/config/crud/v1/*.yaml'
type: crud
First Use Case
Trigger a GET /api/v1/posts request to list posts with auto-pagination/sorting/filtering.
Configuration-Driven
Define CRUD operations in YAML (e.g., config/crud/v1/posts.yaml):
resources:
App\Entity\Post:
operations:
list:
pagination: { items_per_page: 20 }
sorting: [ { field: 'createdAt', direction: 'desc' } ]
create:
validation_groups: [ 'Default', 'Create' ]
Event-Driven Extensibility
Listen to events in Symfony’s EventDispatcher:
// src/EventListener/PostCreateListener.php
use Beefeater\CrudEventBundle\Event\CrudEvent;
class PostCreateListener {
public function onPostCreate(CrudEvent $event): void {
$post = $event->getEntity();
$post->setSlug(Str::slug($post->getTitle()));
}
}
Register in services.yaml:
services:
App\EventListener\PostCreateListener:
tags:
- { name: 'kernel.event_listener', event: 'beefeater.crud.post.create' }
Custom Controllers
Override default controllers by specifying a controller in YAML:
resources:
App\Entity\Post:
operations:
create:
controller: App\Controller\CustomPostController::createAction
Pagination/Sorting/Filtering Use query parameters:
GET /api/v1/posts?page=2&sort=-createdAt&filter[status]=published
Repository calls; extend via custom DQL.Validation component with validation_groups.operations:
delete:
security: ROLE_ADMIN
resources:
App\Entity\Post:
operations:
list:
excel_export: true
Route Naming Conflicts
beefeater_crud_<resource>_<operation>. Override via route_name in YAML:
operations:
list:
route_name: 'api_v1_posts_list'
Event Dispatching Order
pre_<operation>, post_<operation>. Avoid side effects in pre_ events if post_ listeners depend on them.Pagination Edge Cases
items_per_page: 15. Override globally in config/packages/beefeater_crud.yaml:
beefeater_crud:
default_pagination: { items_per_page: 50 }
UUID Route Parameters
param_converter is configured for UUIDs in Symfony (e.g., NelmioApiDocBundle or api_platform).Enable Logging
Configure in config/packages/beefeater_crud.yaml:
beefeater_crud:
logging: true
Logs appear in var/log/beefeater_crud.log.
Validate YAML
Use Symfony’s debug:config to validate config:
php bin/console debug:config beefeater_crud
Custom Event Subscribers
Extend core events (e.g., CrudEvent) to add domain logic:
class CustomSubscriber implements EventSubscriberInterface {
public static function getSubscribedEvents(): array {
return [
'beefeater.crud.post.pre_create' => 'onPreCreate',
];
}
}
Dynamic Configuration
Load YAML configs dynamically via CrudConfigLoader service:
$loader = $container->get('beefeater_crud.config_loader');
$config = $loader->load('v1/posts.yaml');
Override Templates
Customize response templates by extending the bundle’s Twig templates (located in vendor/beefeater/crud-event-bundle/templates).
Add New Operations
Extend the CrudOperation class to support custom actions (e.g., publish). Register via YAML:
operations:
publish:
method: POST
path: /publish
controller: App\Controller\PostController::publishAction
How can I help you explore Laravel packages today?