Новое в Symfony 4.3: Автоматическая валидация

Рассмотрим следующую сущность Doctrine:

use Doctrine\ORM\Mapping as ORM;

/** @ORM\Entity */
class SomeEntity
{
    // ...

    /** @ORM\Column(length=4) */
    public $pinCode;
}

Приведет ли следующий код к ошибке проверки?

$entity = new SomeEntity();
$entity->pinCode = '1234567890';
$violationList = $validator->validate($entity);

Ответ – нет. Удивительно, но многие разработчики Symfony все еще не осознают, что конфигурация отображения Doctrine (например, @ORM\Column (length = 4)) на самом деле ничего не проверяет. Этот конфиг – просто подсказка для генератора схемы Doctrine. Это может привести к юзабилити и даже проблемам безопасности.

В Symfony 4.3 улучшили это, введя автоматическую проверку, основанную на отображении Doctrine. Вот почему в Symfony 4.3 предыдущий пример дал бы следующий результат:

$violationList = $validator->validate($entity);

var_dump((string) $violationList);
// Object(App\Entity\SomeEntity).columnLength:\n
//     This value is too long. It should have 4 characters or less.
//     (code d94b19cc-114f-4f44-9cc4-4138e80a87b9)\n

Эта новая функция анализирует сопоставления, такие как @ORM\Column(length=4), чтобы автоматически добавлять связанную проверку @Assert\Length(max=4) к тому же свойству. В частности, следующие проверки автоматизированы:

Doctrine mapping
Automatic validation constraint
nullable=false@Assert\NotNull
type=...@Assert\Type(...)
unique=true@UniqueEntity
length=...@Assert\Length(...)

Для автоматической проверки nullable=false и type=... необходимо установить компонент PropertyInfo. Кроме того, эта новая функция будет отключена по умолчанию, но включена для новых проектов.

Поскольку компонент Form, а также платформа API для внутреннего использования используют компонент Validator, все ваши формы и WEB-API также автоматически получат выгоду от этих автоматических ограничений.

И наконец, имейте в виду, что хотя эта автоматическая проверка удобна, ее недостаточно для большинства приложений, поэтому вам все равно придется вручную настроить дополнительные ограничения проверки Symfony.