Installation Add the bundle via Composer:
composer require elao/form-theme-bundle
Enable the bundle in config/bundles.php (Symfony) or config/app.php (Laravel via Symfony bridge):
Elao\FormThemeBundle\ElaoFormThemeBundle::class => ['all' => true],
First Use Case Generate a theme key for a form in a controller or service:
use Elao\FormThemeBundle\Generator\ThemeKeyGenerator;
$generator = new ThemeKeyGenerator();
$themeKey = $generator->generate('my_form_type', ['field1', 'field2']);
// Output: e.g., `my_form_type_field1_field2`
Where to Look First
src/Generator/ThemeKeyGenerator.php – Core logic for key generation.tests/ – Example use cases and edge cases.generate() method signature and parameters.Dynamic Form Theming Use the generator to dynamically create theme keys for forms based on user input or runtime conditions:
$fields = request()->input('selected_fields', []);
$themeKey = $generator->generate('user_profile', $fields);
Integration with Symfony Forms If using Symfony forms (via Laravel Bridge), attach the theme key to form options:
$form = $formFactory->createBuilder('user_profile', UserType::class)
->add('name', TextType::class)
->getForm();
$form->add('theme_key', HiddenType::class, [
'data' => $generator->generate('user_profile', ['name']),
]);
Caching Theme Keys Cache generated keys to avoid recomputation (e.g., in Laravel’s cache layer):
$cacheKey = "theme_key_{$formType}_{" . implode('_', $fields)}";
$themeKey = Cache::remember($cacheKey, 3600, function() use ($generator, $formType, $fields) {
return $generator->generate($formType, $fields);
});
$this->app->singleton(ThemeKeyGenerator::class, function ($app) {
return new ThemeKeyGenerator();
});
trait UsesFormThemeKeys {
protected function getThemeKey(string $formType, array $fields): string {
return app(ThemeKeyGenerator::class)->generate($formType, $fields);
}
}
$themeKey = $request->input('theme_key');
$expectedKey = $this->getThemeKey('order_form', ['items']);
if ($themeKey !== $expectedKey) {
throw new \InvalidArgumentException("Invalid theme key.");
}
Key Collisions
$fields contains duplicate values (e.g., ['name', 'name']), the generator may produce unexpected keys.array_unique($fields)) before passing to generate().Case Sensitivity
['Name', 'name'] may not behave as expected.strtolower()) if case insensitivity is required.Empty Fields
[]) may not yield a useful key.$fields = $fields ?: ['default_field'];
Performance
\Log::debug('Generated theme key', ['key' => $themeKey, 'form_type' => $formType, 'fields' => $fields]);
$this->assertEquals(
'form_type_field_with+symbol',
$generator->generate('form_type', ['field_with+symbol'])
);
Custom Separators
_) separator by extending ThemeKeyGenerator:
class CustomThemeKeyGenerator extends ThemeKeyGenerator {
protected function getSeparator(): string {
return '-';
}
}
Field Transformers
$fields = array_map('sanitize_field', $fields);
$themeKey = $generator->generate($formType, $fields);
Symfony Event Listeners
PRE_SET_DATA) to auto-generate theme keys:
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$data = $event->getData();
$themeKey = $generator->generate($event->getForm()->getConfig()->getType()->getName(), array_keys($data));
$event->getForm()->add('theme_key', HiddenType::class, ['data' => $themeKey]);
});
ThemeKeyGenerator.How can I help you explore Laravel packages today?