contenir / formbuilder
Framework-agnostic form-builder engine for Contenir CMS — runtime-editable form definitions, builder-form construction, server-side submission validation.
Requires
- php: ^8.1 || ^8.2 || ^8.3
- laminas/laminas-filter: ^2.30
- laminas/laminas-form: ^3.20
- laminas/laminas-inputfilter: ^2.30
- laminas/laminas-validator: ^2.50 || ^3.0
- psr/log: ^1.0 || ^2.0 || ^3.0
Requires (Dev)
- contenir/storage: ^0.1.0
- phpunit/phpunit: ^11.0
- squizlabs/php_codesniffer: ^3.10
Suggests
- contenir/storage: Required for the file field type. Pass a Contenir\Storage\StorageManager into FormSubmissionService when uploads need to land on a configured storage profile.
README
Framework-agnostic form-builder engine for Contenir CMS.
Provides the runtime-editable form-definition value objects, the registry of
field types, the curated validator vocabulary, the conditional-visibility
rule engine, and the build/submit services that turn a stored definition
into a working Laminas\Form\Form and a validated submission.
This package is the pure-PHP core. It has no opinion about how form
definitions are loaded (DB, JSON, hardcoded array — bring your own loader)
or how submissions are stored (registrar pattern). Adapter packages such
as contenir/formbuilder-laminas-mvc wire it into a host framework.
Install
composer require contenir/formbuilder
Optional but commonly paired:
contenir/storage— required for thefilefield type, passed in toFormSubmissionService.
Layout
src/
├── Definition/ value objects: FormDefinition, SectionDefinition,
│ GroupDefinition, RowDefinition, FieldDefinition,
│ ValidatorDefinition, NotificationDefinition,
│ WebhookDefinition
├── FieldType/ FieldTypeRegistry + FieldTypeInterface + 17 built-in
│ types (text, email, url, tel, number, date, time,
│ datetime, select, multiselect, radio, checkbox,
│ multicheckbox, textarea, file, hidden, content)
├── Validator/ ValidatorFactory — curated vocabulary mapping onto
│ Laminas validators (StringLength, Between, Hostname,
│ Regex, Identical, EmailAddress)
├── Conditional/ RuleEvaluator + ConditionalRulesParser
└── Service/ FormBuilderService, FormSubmissionService,
TokenReplacer, BuilderForm, SubmissionResult
Usage
use Contenir\FormBuilder\Definition\FormDefinition; use Contenir\FormBuilder\FieldType\FieldTypeRegistry; use Contenir\FormBuilder\Service\FormBuilderService; use Contenir\FormBuilder\Service\FormSubmissionService; use Contenir\FormBuilder\Validator\ValidatorFactory; $registry = new FieldTypeRegistry(); $validators = new ValidatorFactory(); $builder = new FormBuilderService($registry, $validators); $form = $builder->build($definition); // Laminas\Form\Form $service = new FormSubmissionService($builder); $service->attach($yourPersistenceObserver); $result = $service->submit($definition, $_POST, $_FILES, [ 'ip' => $_SERVER['REMOTE_ADDR'] ?? null, 'user_id' => null, 'meta' => [], ]);
License
MIT.