Installation:
composer require assoconnect/validator-bundle
Accept the Symfony Flex recipe when prompted (y or p for permanent).
First Use Case: Validate an email field in an entity:
use AssoConnect\ValidatorBundle\Validator\Constraint as AssoConnectAssert;
class User
{
#[AssoConnectAssert\Email()]
public string $email;
}
Where to Look First:
EmailValidator.php, FrenchSirenValidator.php).Apply constraints directly to entity properties:
class Order
{
#[AssoConnectAssert\Money(min: 0.01, max: 10000)]
public float $amount;
#[AssoConnectAssert\Timezone()]
public string $timezone;
}
Use @Entity() to auto-apply validators based on Doctrine types:
#[AssoConnectAssert\Entity()]
class BankAccount
{
#[ORM\Column(type: 'iban')]
public string $iban; // Auto-validates as `@Iban()`, `@Length(27)`, etc.
}
Extend EntityValidator to override defaults:
class CustomEntityValidator extends EntityValidator
{
protected function getConstraintsForType(string $type): array
{
return match ($type) {
'iban' => [new Assert\Iban(), new Assert\Length(34)],
default => parent::getConstraintsForType($type),
};
}
}
Register the validator in services.yaml:
services:
App\Validator\Constraints\CustomEntityValidator:
tags: [validator.constraint_validator]
Use constraints with runtime parameters:
#[AssoConnectAssert\Phone(countryCode: 'FR')]
public string $phone;
Integrate with Symfony Forms:
$builder->add('email', EmailType::class, [
'constraints' => [new AssoConnectAssert\Email()],
]);
composer.json).iban, email types).ValidatorInterface in tests:
$validator = $container->get('validator');
$errors = $validator->validate($entity);
Symfony Version Mismatch:
v2.38.0 if stuck on Symfony 6.4.PHP Version Requirements:
v2.39.0 for PHP 8.3 support.Doctrine Auto-Validation Limitations:
@Entity() only works for Doctrine-mapped properties. Non-Doctrine properties require manual constraints.@Assert\Type() for non-Doctrine fields.Constraint Overrides:
ConstraintValidatorInterface and be tagged in services.yaml.services:
App\Validator\Constraints\CustomEmailValidator:
tags: [validator.constraint_validator]
Deprecated Annotations:
#[AssoConnectAssert\Email()]).Timezone Validation:
Timezone validator uses PHP’s DateTimeZone class. Invalid timezones (e.g., "America/New_York" vs. "Invalid/Zone") will fail silently unless you add a custom message:
#[AssoConnectAssert\Timezone(message: 'The timezone "{{ value }}" is invalid.')]
French SIREN/SIRET:
1234567890123 vs. 12345678901234) will fail.#[AssoConnectAssert\FrenchSiren(message: 'Invalid SIREN format.')] for custom messages.Validator Not Triggering:
services.yaml:
services:
AssoConnect\ValidatorBundle\Validator\Constraints\EmailValidator:
tags: [validator.constraint_validator]
Custom Validator Not Working:
ConstraintValidatorInterface.dump($validator->validate($value)) to inspect validation logic.Doctrine Auto-Validation Failing:
type: 'iban').Performance Issues:
@Entity() constraint validates all properties on every call. For large entities, manually apply constraints to critical fields.#[AssoConnectAssert\Entity(skipProperties: ['nonCriticalField'])].Add New Validators:
AbstractValidator and register the service:
class CustomNifValidator extends AbstractValidator
{
public function validate($value, Constraint $constraint)
{
// Custom logic
}
}
services:
App\Validator\Constraints\CustomNifValidator:
tags: [validator.constraint_validator]
Override Existing Constraints:
CustomEmail) and validator, then replace the default in services.yaml:
services:
AssoConnect\ValidatorBundle\Validator\Constraints\EmailValidator:
class: App\Validator\Constraints\CustomEmailValidator
Add Custom Messages:
message directly in the constraint:
#[AssoConnectAssert\Phone(message: 'Invalid phone number for {{ countryCode }}.')]
Integrate with API Platform:
#[ApiProperty]:
#[ApiProperty(constraints: [new AssoConnectAssert\Email()])]
public string $email;
Combine with Symfony’s Built-ins:
Use the bundle alongside Symfony’s native constraints (e.g., @Assert\NotBlank()):
#[Assert\NotBlank]
#[AssoConnectAssert\Email]
public string $email;
Validation Groups:
Apply constraints to specific groups (e.g., Default, Registration):
#[AssoConnectAssert\Email(groups: ['Registration'])]
public string $email;
Bulk Validation:
Validate collections with ValidatorInterface::validate():
$validator->validateValue($users, new Assert\All([
new AssoConnectAssert\Email(),
]));
Localization:
Customize error messages in validation.yaml:
constraints:
AssoConnect\ValidatorBundle\Validator\Constraint\Email:
message: 'L''adresse email "{{ value }}" est invalide.'
How can I help you explore Laravel packages today?