dlmappstools/crudgeneratorbundle
Installation
Add the bundle to your composer.json:
composer require dlmappstools/crudgeneratorbundle
Enable it in config/bundles.php:
return [
// ...
DlmAppsTools\CrudGeneratorBundle\DlmAppsToolsCrudGeneratorBundle::class => ['all' => true],
];
Configuration Publish the default config:
php bin/console dlm-apps-tools:crud:generate:config
Edit config/packages/dlmapps_tools_crud_generator.yaml to define your CRUD entities and fields.
First Use Case
Generate a basic CRUD for a User entity:
php bin/console dlm-apps-tools:crud:generate --entity=App\Entity\User
This creates:
src/Controller/UserCrudController.php)templates/crud/user/)src/Form/UserType.php)Define Entity & Fields
Configure your entity in config/packages/dlmapps_tools_crud_generator.yaml:
dlmapps_tools_crud_generator:
entities:
App\Entity\User:
fields:
- { name: username, type: text, label: 'Username' }
- { name: email, type: email, label: 'Email' }
actions:
- list
- create
- edit
- delete
Generate & Customize Run the generator:
php bin/console dlm-apps-tools:crud:generate --entity=App\Entity\User --overwrite
UserCrudController (e.g., configureActions()).UserType to add validation or dynamic fields:
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
$builder->add('isActive', CheckboxType::class, ['label' => 'Active']);
}
Integrate with Existing Logic
getServices().prePersist, postRemove) in your EventSubscriber:
public static function getSubscribedEvents()
{
return [
UserCrudEvents::PRE_PERSIST => 'onPrePersist',
];
}
Routing & Security
# config/routes.yaml
user_crud:
resource: '@DlmAppsToolsCrudGeneratorBundle/Resources/config/routing/crud.yaml'
prefix: /admin
security: role: ROLE_ADMIN
field_options in config to pass dynamic data (e.g., choices for a select field):
fields:
- { name: role, type: entity, class: App\Entity\Role, label: 'Role', field_options: { choice_label: 'name' } }
templates/base_crud/ to share layouts across multiple CRUDs.Serializer to expose CRUD endpoints as API:
// UserCrudController.php
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
public function __construct(NormalizerInterface $normalizer) {
$this->normalizer = $normalizer;
}
public function apiListAction()
{
$users = $this->getDoctrine()->getRepository(User::class)->findAll();
return new JsonResponse($this->normalizer->normalize($users));
}
Overwriting Files
--overwrite flag is required to regenerate existing files. Without it, the generator skips updates.git diff before overwriting to review changes:
git diff HEAD -- src/Controller/UserCrudController.php
Field Type Mismatches
string → TextType). Custom mappings may break forms.getFieldType() in a custom form type extension.Event Subscribers Not Triggering
EventSubscriber is tagged in services.yaml:
services:
App\EventSubscriber\UserCrudSubscriber:
tags: [dlmapps_tools.crud.event_subscriber]
Translation Issues
config/packages/translation.yaml:
frameworks:
translation:
paths: ['%kernel.project_dir%/translations']
php bin/console dlm-apps-tools:crud:generate --debug
--dry-run to preview changes without writing files.Custom Templates Override the default Twig templates by placing them in:
templates/crud/[entity_name]/[action].html.twig
Example: templates/crud/user/list.html.twig overrides the list view.
Dynamic Actions
Add custom actions by extending the controller and overriding configureActions():
public function configureActions(ActionsConfiguration $configuration)
{
$configuration->add('export', ExportAction::class)
->setPath('/export')
->setLabel('Export');
}
Field Transformers
Transform data before/after form submission by implementing FieldTransformerInterface:
class PasswordTransformer implements FieldTransformerInterface
{
public function transform($value)
{
return password_hash($value, PASSWORD_BCRYPT);
}
}
Register it in config:
fields:
- { name: password, type: password, transformer: App\Transformer\PasswordTransformer }
Bulk Actions
Enable bulk operations by configuring bulk_actions in the entity settings:
entities:
App\Entity\User:
bulk_actions:
- { name: 'delete_selected', label: 'Delete Selected' }
Implement the logic in a custom action class.
How can I help you explore Laravel packages today?