Symfony. Как сделать валидацию с зависимостью от значений св-в сущности?

В Symfony есть несколько способов реализации валидации сущностей с зависимостью от значений свойств. Один из самых распространенных и гибких способов - использование валидаторов с использованием выражений.

Для начала вам понадобится установить компонент валидации Symfony, если вы его еще не установили. Выполните следующую команду в консоли:

composer require symfony/validator

Предположим, у вас есть сущность Product, у которой есть два свойства: price и quantity. Вам нужно добавить валидацию, чтобы quantity не превышало price. Вот как это можно сделать:

use SymfonyComponentValidatorConstraints as Assert;

class Product
{
    /**
     * @AssertExpression(
     *      "this.getQuantity() <= this.getPrice()",
     *      message="Quantity should not exceed price"
     * )
     */
    private $quantity;

    private $price;

    // Геттеры и сеттеры для свойств
}

Обратите внимание на использование аннотации @AssertExpression. В качестве аргумента она принимает выражение, которое должно быть истинным, чтобы сущность была валидной. В нашем случае, это выражение this.getQuantity() <= this.getPrice(), которое проверяет, что значение свойства quantity не превышает значение свойства price.

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

Для того чтобы проверить валидность вашей сущности, вы можете использовать сервис validator Symfony:

use SymfonyComponentValidatorValidation;

$validator = Validation::createValidator();

$product = new Product();
$product->setPrice(10);
$product->setQuantity(5);

$violations = $validator->validate($product);

if (count($violations) > 0) {
    // Сущность не прошла валидацию
    foreach($violations as $violation) {
        echo $violation->getMessage();
    }
} else {
    // Сущность прошла валидацию
}

Теперь, если значение свойства quantity превышает значение свойства price, вы увидите сообщение "Quantity should not exceed price".

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