Рассмотрим следующую сущность 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.