By default, entity validation based on attached \Doctrine\ORM\Mapping\Column
attributes and attributes inherited
ColumnValidator interface.
Also, you can add custom validators by EntityValidator::addValidator()
or create instance of ColumnValidator interface.
Validator skip validation:
- If
Column
attribute declared as notupdatable
and/orinsertable
- Validation on persist/insert and property have
\Doctrine\ORM\Mapping\Id
attribute
Validator checks by column type:
- If property value is null (or not defined), but
Column
attribute not declared asnullable
or/and don't have default value (options: ['default' => '...']
) - If
Column
attribute have numeric type (integer, float, decimal and etc.):- If defined
unsigned
option, then property value must be more than zero - If type
decimal
and definedprecision
, then check size of value
- If defined
- If
Column
attribute have string type (sting, text and etc.):- If defined
fixed
option andlength
, then check string length - If defined only
length
, then check string length
- If defined
- If
Column
attribute have enum type:- If defined
enumType
, then check is proprerty value is declared in enum class
- If defined
ColumnValidator
attributes:
The postValidate
(EntityValidator::EVENT_POST_VALIDATE
) event triggers after successful validation, the syntax of
listener method: function (LifecycleEventArgs $args): void
.
Validates Product
entity before insert/update data:
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use \EnsoStudio\Doctrine\ORM\ColumnValidators;
use EnsoStudio\Doctrine\ORM\EntityValidator;
use EnsoStudio\Doctrine\ORM\EntityValidationException;
#[ORM\Entity]
#[ORM\Table(name: 'products')]
#[ORM\HasLifecycleCallbacks]
class Product
{
...
#[ORM\Column(type: Types::STRING, length: 200)]
#[ColumnValidators\MinLength(2)]
#[ColumnValidators\Slug]
private string $slug;
#[ORM\Column(type: Types::STRING, length: 150)]
#[ColumnValidators\Type('print')]
private string $name;
#[ORM\PrePersist]
public function beforeInsert(): void
{
$validator = new EntityValidator($this);
// Callback same to ColumnValidators\MinLength(3)
$validator->addValidator(
'name',
static function (string $propertyValue, string $propertyName, object $entity) {
if (mb_strlen($propertyValue) < 3) {
throw new EntityValidationException(
['% less than 3 characters', $propertyName],
$propertyName,
$entity
);
}
}
);
$validator->validate();
}
#[ORM\PreUpdate]
public function beforeUpdate(): void
{
$validator = new EntityValidator($this);
...
$validator->validate(true);
}
}
Or you can use EntityValidationSubscriber
to validates all entities:
use Doctrine\ORM\EntityManager;
use EnsoStudio\Doctrine\ORM\EntityValidationSubscriber;
...
$entityManager = new EntityManager($connection, $config);
$entityManager->getEventManager()
->addEventSubscriber(new EntityValidationSubscriber(true));
- PHP >= 8.1 (with
mbstring
extension) - doctrine/orm >= 3.3
If you do not have Composer, you may install it by following the instructions at getcomposer.org.
You can then install this library using the following command:
composer require ensostudio/doctrine-entity-validator