Installation
composer require amaxlab/form-bundle
Add to config/bundles.php (Symfony 4+):
return [
// ...
Amaxlab\FormBundle\AmaxlabFormBundle::class => ['all' => true],
];
Configure reCAPTCHA
Register keys in config/packages/amaxlab_form.yaml:
amaxlab_form:
recaptcha2:
public_key: '%env(RECAPTCHA_PUBLIC_KEY)%'
private_key: '%env(RECAPTCHA_PRIVATE_KEY)%'
First Use Case: select_or_add
// src/Form/YourType.php
use Amaxlab\FormBundle\Form\Type\SelectOrAddType;
$builder->add('entity', SelectOrAddType::class, [
'class' => YourEntity::class,
'add_form' => function (FormBuilderInterface $builder, array $options) {
$builder->add('name', TextType::class);
$builder->add('save', SubmitType::class);
},
'label' => 'Select or add new',
]);
select_or_add Workflowadd_form option to include custom fields or validation.{{ form_row(form.entity) }}
Renders a dropdown + "Add New" button. The "add" modal/form is typically rendered via JavaScript (e.g., using Symfony UX Turbo or Stimulus).$builder->add('recaptcha', AmaxlabRecaptcha2Type::class, [
'mapped' => false,
'label' => 'Verify you are human',
]);
{{ form_row(form.recaptcha) }}
Renders the reCAPTCHA widget. Ensure the public_key is set in your template (e.g., via data-sitekey).amaxlab_form.select_or_add.add_form_builder events to modify the nested form dynamically:
// src/EventListener/AddFormSubscriber.php
use Amaxlab\FormBundle\Event\AddFormEvent;
public function onAddFormBuild(AddFormEvent $event) {
$event->getFormBuilder()->add('custom_field', TextType::class);
}
Register in services.yaml:
services:
App\EventListener\AddFormSubscriber:
tags:
- { name: kernel.event_subscriber }
reCAPTCHA Key Mismatch
public_key/private_key match your domain in the reCAPTCHA admin panel. Invalid keys cause silent validation failures.JavaScript Dependency for select_or_add
Entity Manager in select_or_add
EntityManager. If using custom repositories or services, ensure they’re autowired into the form type or passed via options:
$builder->add('entity', SelectOrAddType::class, [
'entity_manager' => $this->entityManager,
]);
dump($form->getErrors()) to inspect reCAPTCHA or entity validation issues.config/packages/guzzle.yaml to debug API calls:
guzzle:
plugins:
- \GuzzleHttp\Subscriber\Log\LogPlugin
Custom reCAPTCHA Theme
Override the Twig template for amaxlab_recaptcha2 in templates/AmaxlabFormBundle/Form/amaxlab_recaptcha2.html.twig.
Async reCAPTCHA Validation
For better UX, validate reCAPTCHA via AJAX before form submission. Use the bundle’s AmaxlabRecaptchaValidator service directly:
$validator = $container->get('amaxlab_form.recaptcha_validator');
$isValid = $validator->validate($response, $publicKey);
Dynamic select_or_add Options
Use the query_builder option to filter entities dynamically:
$builder->add('entity', SelectOrAddType::class, [
'query_builder' => function (EntityManagerInterface $em) {
return $em->createQueryBuilder()
->select('e')
->from(YourEntity::class, 'e')
->where('e.isActive = :active')
->setParameter('active', true);
},
]);
.env and reference them in config/packages/amaxlab_form.yaml:
amaxlab_form:
recaptcha2:
public_key: '%env(RECAPTCHA_SITE_KEY)%'
private_key: '%env(RECAPTCHA_SECRET_KEY)%'
php bin/console cache:clear) if testing locally with the same keys.How can I help you explore Laravel packages today?