Как проверить поле, которое зависит от другого в Symfony - PullRequest
1 голос
/ 23 мая 2019

Нужно найти способ, как в Symfony в пользовательских валидаторах проверять поля на основе других значений. Далее я представил, как мы проверяем в унаследованном приложении, но как мы можем получить значения из другого поля в Symfony?

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

private function validate_uds_message($size, $start, $stop) {
    return $start <= $stop && $stop <= ($size * 1024) ? true : false;
}

Validator:

<?php

namespace App\Validator\Constraints;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;

class UdsMessageValidator extends ConstraintValidator
{
    public function validate($value, Constraint $constraint)
    {
        if (!$constraint instanceof UdsMessage) {
            throw new UnexpectedTypeException($constraint, UdsMessage::class);
        }

        if (null === $value || '' === $value) {
            return;
        }

        if (!is_int($value)) {
            throw new UnexpectedValueException($value, 'int');
        }

        $startBit = /* ... */;
        $stopBit = /* ... */;

        if ($startBit <= $stopBit && $stopBit <= ($value * 1024)) {
            return true;
        } else {
            $this->context->buildViolation($constraint->message)
                ->setParameter('{{ udsId }}', $value)
                ->addViolation();
        }
    }
}

1 Ответ

2 голосов
/ 23 мая 2019

Хорошо, я нашел решение, как с ним работать, я предоставлю свое решение:

Валидатор:

<?php

namespace App\Validator\Constraints;

use App\Model\Odx2Parameter;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
use Symfony\Component\Validator\Exception\UnexpectedValueException;

class UdsMessageValidator extends ConstraintValidator
{
    public function validate($parameter, Constraint $constraint)
    {
        if (!$constraint instanceof UdsMessage) {
            throw new UnexpectedTypeException($constraint, UdsMessage::class);
        }

        if (!($parameter instanceof Odx2Parameter)) {
            throw new UnexpectedValueException($parameter, Odx2Parameter::class);
        }

        $udsId = $parameter->getUdsId();
        $startBit = $parameter->getStartBit();
        $stopBit = $parameter->getStopBit();

        if ($startBit <= $stopBit && $stopBit <= ($udsId * 1024)) {
            return true;
        } else {
            $this->context->buildViolation($constraint->message)
                ->setParameter('{{ udsId }}', $udsId)
                ->atPath('udsId')
                ->addViolation();

            $this->context->buildViolation($constraint->startBitMessage)
                ->setParameter('{{ startBit }}', $startBit)
                ->setParameter('{{ stopBit }}', $stopBit)
                ->atPath('startBit')
                ->addViolation();

            $this->context->buildViolation($constraint->stopBitMessage)
                ->setParameter('{{ stopBit }}', $stopBit)
                ->setParameter('{{ stopBit }}', $stopBit)
                ->atPath('stopBit')
                ->addViolation();
        }
    }
}

Ограничение:

<?php

namespace App\Validator\Constraints;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 */
class UdsMessage extends Constraint
{
    public $message = 'The UDS "{{ udsId }}" contains an illegal startBit or stopBit value.';
    public $startBitMessage = '';
    public $stopBitMessage = '';

    public function getTargets()
    {
        return self::CLASS_CONSTRAINT;
    }
}

FormType:

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'constraints' => [
            New UdsMessage()
        ]
    ]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...