FpJsFormValidatorBundle converts Symfony form validation metadata into JavaScript validation rules and attaches client-side validators to rendered forms.
This branch has been revived for a modern PHP/Symfony baseline:
- PHP 8.1+
- Symfony 5.4, 6.4, or 7.x components
- Twig 3
- PHPUnit 10/11
- PSR-4 autoloading from
src/
The old Symfony 2/3 + Assetic + Selenium test application was replaced upstream
by a newer Tests/app fixture. The maintained test commands now cover the PHP
model/factory/controller core, JavaScript constraints, and a Cypress smoke test
against the Symfony test application.
For older Symfony applications, use the historical branches:
- Symfony 4:
1.6 - Symfony 3.1:
1.5 - Symfony 3.0:
1.4 - Symfony 2.8 or 2.7:
1.3 - Symfony 2.6 or older:
1.2
Install the bundle with Composer:
composer require fp/jsformvalidator-bundleIf you are testing this revived branch before a tagged release, require the development branch explicitly:
composer require fp/jsformvalidator-bundle:"dev-master"Register the bundle in config/bundles.php:
<?php
return [
// ...
Fp\JsFormValidatorBundle\FpJsFormValidatorBundle::class => ['all' => true],
];Validation is enabled for every form by default. You can disable it globally:
# config/packages/fp_js_form_validator.yaml
fp_js_form_validator:
js_validation: falsePer-form and per-field disabling is documented in Disabling validation.
If you use Symfony's Doctrine UniqueEntity constraint, import the bundle route:
# config/routes/fp_js_form_validator.yaml
fp_js_form_validator:
resource: '@FpJsFormValidatorBundle/Resources/config/routing.xml'
prefix: /fp_js_form_validatorMake sure your security configuration allows requests to this route.
There are two common ways to load the JavaScript files.
Encore
// ...
.addEntry('app', './assets/js/app.js')
+ .addEntry(
+ 'FpJsFormValidator',
+ './vendor/fp/jsformvalidator-bundle/src/Resources/public/js/FpJsFormValidatorWithJqueryInit.js'
+ )
// ...
;Then include the entry in your template:
{{ encore_entry_script_tags('FpJsFormValidator') }}
{{ encore_entry_script_tags('app') }} import $ from 'jquery';
+import '../vendor/fp/jsformvalidator-bundle/src/Resources/public/js/FpJsFormValidator';
+import '../vendor/fp/jsformvalidator-bundle/src/Resources/public/js/jquery.fpjsformvalidator';Adjust the import path to your application structure.
After the scripts are loaded, render the generated config and queued form models:
{{ js_validator_config() }}
{{ init_js_validation() }}If you need manual initialization for a specific form or event, see manual initialization.
After the bundle is registered, the form extension adds every enabled root form
to an internal queue. Calling init_js_validation() renders JavaScript models
for the queued forms:
{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}
{{ init_js_validation(form) }}You can pass false as the second argument to avoid automatic initialization on
page load:
{{ init_js_validation(form, false) }}This bundle finds related DOM elements for each Symfony form element and attaches an object validator to them. The validator contains the properties and methods that define the validation process for that form element.
If your form rendering is customized, start with custom rendering notes.
- Disable validation for a specified field
- Error display
- Get validation groups from a closure
- Getters validation
- The Callback constraint
- The Choice constraint callback
- Custom constraints
- Custom data transformers
- Checking entity uniqueness
- Form submit by JavaScript
- onValidate callback
- Run validation on custom event
- Collections validation
Install dependencies:
composer updateRun the PHP test suite:
composer testRun PHPStan static analysis:
composer phpstanRun PHP coverage:
composer coverageRun the JavaScript unit tests and Cypress browser smoke test:
npm testRun JavaScript coverage:
npm run test:coverageUseful local checks:
composer validate --strict
git diff --checkThe same maintained test and static-analysis checks are also run by GitHub Actions on pushes and pull requests.
